Используете Redux? Используете хуки? пришло время протестировать перехватчики реакции-редукции

Если вы здесь, то, вероятно, слышали о React v16.8, который запустил новый подход к созданию компонентов и поддержанию их жизненного цикла с помощью хуков (ознакомьтесь с API).

Хотя хуки обратно совместимы, очень интересно начать использовать их в наших приложениях, и хорошая новость заключается в том, что хуки redux присоединились к нам!

С модной задержкой react-redux опубликовал новую версию (v7.1.0), которая предлагает набор API-интерфейсов redux с альтернативой существующему connect()Higher Order Component, который позволяет нашим функциональным компонентам подписаться и общаться с redux store.

Изменения перехватчиков реакции и перехватов response-redux приводят к потенциальным структурным изменениям в том, как мы пишем и организуем наш код, а также в том, как мы относимся к логической структуре и думаем о ней.

В следующем блоге я попытаюсь упростить использование новых хуков redux, используя краткое описание API, предложение структуры и базовый пример.

быстрый обзор хуков react-redux

useSelector (selector: state = ›{}, [equalFn ?: () =› {}]) извлекает значения из состояния хранилища redux, по сути аналогично функцииmapStateToProps, реализованной в хуке, с некоторыми небольшими отличиями. . Селектор будет запускаться всякий раз, когда функциональный компонент выполняет рендеринг, он также запускает селектор всякий раз, когда действие отправляется в хранилище redux. По умолчанию equalFn является ссылочным равенством (===), что означает, что когда действие будет отправлено, селектор вызовет повторную визуализацию, если одно из полей изменилось, что отличается от mapState. Если вы хотите сохранить поведение mapState, импортируйте shallowEqual и передайте его в качестве второго параметра или используйте мемоизированную библиотеку, такую ​​как повторный выбор.

useDispatch () возвращает функцию Dispatch, которая позволяет нам отправлять действия в хранилище redux (тот же API, что и react-redux-hooks), аналогично mapDispatchToProps. Чтобы избежать ненужного рендеринга дочернего компонента при изменении ссылок, рекомендуется запоминать его с помощью useCallback.

useStore () - не обычный обработчик, который возвращает ссылку на то же хранилище Redux, которое было передано компоненту <Provider>.

Не пропускайте redux hooks полную документацию по API https://react-redux.js.org/next/api/hooks#hooks.

Изменение структуры

В старом мире (в терминах сокращения) мы думали о нашей структуре как о молекулярной модели. «Компоненты» - это атомы, функциональные компоненты без состояния, а «Контейнеры» - это молекулы, связанные с состоянием и связанные компоненты с собственным жизненным циклом и подпиской на хранилище redux. Теперь у нас есть один способ создания компонентов, который меняет наше представление о структуре. Должны ли мы по-прежнему делиться на компоненты и контейнеры? Это хороший вопрос.

Раньше в больших приложениях наличие контейнера с большим списком извлеченных свойств хранилища redux и диспетчеров действий приводило к структуре, в которой представление и связанные с ним методы хранилища redux были разделены:

Столкнувшись с той же проблемой масштабирования, что и контейнер с большим количеством ловушек и логики, он может выглядеть перегруженным и неорганизованным. Мой новый подход - разделить контейнер на отдельный файл-перехватчик:

Базовый пример

Хотя мы так устали от знаменитого примера со списком Todo, я все же думаю, что это был бы более ясный и простой сценарий для понимания нового мира react-redux.

Заявление об ограничении ответственности. Исходный код списка Todo был взят из сокращенной документации. Пример ниже содержит изменения структуры, рефакторинг хуков и мемоизированное состояние редукции с помощью повторного выбора.

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

TodoList - это «контейнер», который отображает строку addTodo, элементы задачи и строку фильтра со статусами «выполнено», «все» и «активно».

Строка добавления задачи получит обратный вызов addTodo из настраиваемого хука useTodo, который отправляет действие добавления задачи в хранилище redux всякий раз, когда вы отправляете элемент задачи.

TodoItems отображает извлеченный объект из хранилища redux. Каждый элемент задачи получает функцию onclick, которая отправляет действие изменения статуса в хранилище redux.

Строка фильтра предоставляет возможность фильтровать элементы списка дел на основе их статусов. Выбранный фильтр извлекается из хранилища redux, а обратный вызов onclick отправляет действие фильтрации в хранилище redux.

Файл хуков содержит реализацию redux-хуков, обернутую пользовательскими хуками для каждого «связанного» компонента. useSelector получает мемоизированный селектор с помощью повторного выбора.

Полный пример можно найти в моем репо: https://github.com/yarindeoh/react-redux-alpha

Резюме

Комбинация React Context API и useReducer () вызвала ажиотаж и новый набор мнений о том, что библиотек управления состоянием, таких как Redux, можно избежать. Я все еще не могу отказаться от их потрясающих возможностей отладки, организованной структуры, концепций и экосистемы.

Новые хуки react-redux просты в использовании! Лично я ждал релиза хука, чтобы начать новые проекты на работе, и у меня была возможность отслеживать решения и улучшения, принимаемые участниками react-redux. Его API динамически меняется на основе отзывов нашего сообщества, что очень важно. Следите за их релизами, следите за ними в твиттере, и пусть сила будет с нами.

Подписывайтесь на меня в твиттере @DekelYarin

📝 Прочтите этот рассказ позже в Журнале.

👩‍💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории из области технологий, ожидающие вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .