Giter Site home page Giter Site logo

stopwatch's Introduction

Stopwatch / Slomux

Slomux — упрощённая, сломанная реализация Flux. Перед вами небольшое приложение, написанное на React + Slomux. Это нерабочий секундомер с настройкой интервала обновления.

Исправьте ошибки и потенциально проблемный код, почините приложение и прокомментируйте своё решение.

При нажатии на "старт" должен запускаться секундомер и через заданный интервал времени увеличивать свое значение на значение интервала.

При нажатии на "стоп" секундомер должен останавливаться и сбрасывать свое значение.

Установка:

$ git clone https://[email protected]/unmyke/stopwatch.git

$ npm install

Запуск приложения в режиме разработки:

$ npm start

Сборка проекта (результат сборки в папке './build'):

$ npm build

Внесенные изменения

модуль slomux

StoreContext

Provider

  • классовый компонент Provider заменен функциональным;
  • использован новый Context API;

createStore

  • добавлена функция unsubsсribe для возможности отписаться от изменений в хранилище;
  • исправлена инициация состояния хранилища: в случае, если в функцию не передано начальное состояние хранилища, то оно устанавливается в значение начального состояния корневого редьюсера;

connect

  • исправлено некорректное поведение, при котором компоненты, обернутые HOC'ом connect в WrappedComponent, не обновлялись при монтировании;
  • добавлена отписка от обновления компонента WrappedComponent перед отмонтированием;
  • классовый компонент WrappedComponent заменен функциональным с использованием хуков для принудительного обновления оборачиваемых компонентов (useState и useEffect) и получения хранилища состояния (useContext);

reducer

  • добавлено значение начального состояние;
  • добавлен возврат текущего состояния при передаче экшна, обработка которого не предусмотрена;
  • добавлена проверка при обработке экшна CHANGE_INTERVAL, не допускающего установки состояния (интервала времени) в отрицательное значение;

компоненты

Interval

  • исправлена очередность аргументов при вызове HOC'а connect;

  • добавлена логика UI, предотвращающая:

    • установку отрицательного значения интервала (отключение кнопки декремента);
    • изменение интервала при запущенном секундомере (отключение кнопок изменения интервала);
  • классовый компонент IntervalComponent заменен функциональным;

Timer

  • функции обработчиков кнопок "Старт" и "Стоп" заменены на стрелочные функции во избежание потери контекста;

  • в обработчике кнопки "Старт" изменено использование функции setTimeout на setInterval для предотвращения остановки секундомера по истечению временного интервала currentInterval;

  • добавлено состояние компонента сurrentIntervalId, хранящее идентификатор интервала setInterval. На основании значения сurrentIntervalId определяется факт запуска секундомера, что дает возможность корректно выполнить отмену выполнения коллбека setInterval при остановке секундомера, предотвращающая изменение состояния currentTime после остановки;

  • добавлена отчистка интервала при отмонтировании компонента;

  • добавлена логика UI, предотвращающая:

    • запуск секундомера повторно (отключение кнопки "Старт");
    • запуск секундомера при незаданном значение интервала (отключение кнопки "Старт");
    • остановка уже остановленного секундомера (отключение кнопки "Стоп");
  • классовый компонент TimerComponent заменен функциональным, хранение состояния UI реализовано с помощью хука useState.

stopwatch's People

Contributors

unmyke avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.