Redux для самых маленьких: как создать свою библиотеку
7 октября 2022 г.

Всем привет!
Этой мой первый пост в дневнике, и посвящён он библиотеке Redux.
За время моего обучения на Hexlet именно эта библиотека породила кучу вопросов а-ля -'как это работает, почему это так работает ?'. Несколько дней я перечитывал теорию по Redux, но в голове не укладывалось, пока я не написал свою собственную версию Redux.
Предлагаю вам вместе со мной написать свою версию библиотеки, просто чтобы разобраться как это работает "под капотом".
В Redux ядром всего является объект store, который возвращает нам функция createStore(). Поэтому давайте начнём с создания этой функции.
Согласно документации createStore принимает первым аргументов функцию reducer, а вторым начальное состояние.
Сначала инициализируем state начальными данными.
let state = reducer(initialState, { type: '__INIT__' });
Функцию
reducerмы напишем позже, но главное понимать, что функция возвращает измененный или неизменённый state.
Функция
createStoreдолжна вернуть объектstoreсо следующими методами:dispatch(), subscribe(), getState().
getState()просто возвращает текущийstate.
subscribe()принимает в качестве аргументаcallback-функциюи складывает функцию в массив.
dispatch()принимает в качестве аргумента объект. Этот объект может иметь внутри любые поля и данные, но в обязательном порядке должен иметь полеtype. Например{ type: 'ADD' }. Когда вызывается методdispatch(), тоstateдолжен быть изменен черезreducer. Reducer - это функция, внутри которой данные меняются, в зависимости от описанной внутри логики. После того, какstateбыл изменен, нам нужно последовательно вызвать всеcallback-функции, которые были добавлены в массив посредством методаsubscribe().
Теперь создаем функцию reducer, которая согласно внутренней логики будет менять состояние.
Здесь все должно быть понятно. Функция принимает объект
actionс полемtype. Например{ type: 'INC }. В зависимости от значения поляtypeотрабатываетswitch-caseконструкция и происходит возврат состояния.
Дальше создаем объект store, интерфейсами которого и будем манипулировать.
Теперь попробуем вызвать методы нашего хранилища store.
Для начала мы хотим чтобы при изменении нашего состояния в console автоматически печаталось текущее состояние.
Теперь вернем текущее состояние
Теперь изменим наше состояние методом dispatch(), который внутри вызывает редьюсер, меняющий состояние, и вызывает последовательно все callback функции из массива subscribers.
Как оказалось, ничего сложного здесь нет. Надеюсь мои эксперименты кому-то помогут быстрее вникнуть в то, как работает библиотека Redux.
Ниже представлен полный код для удобства копирования в свой редактор:
Виталий Моржов
4 года назад
1





