Является ли использование Redux Hooks вместо connect () хорошим дизайном?

В настоящее время существует две концепции подключения компонента React к хранилищу redux: connect () и перехватчики Redux. Мне было интересно, считается ли использование хуков хорошим дизайном программного обеспечения.

  • Это вредит принципу единой ответственности, поскольку компонент отвечает не только за отображение данных, но и за подключение к хранилищу.
  • Между Компонентом и Redux существует тесная связь. Будет сложно повторно использовать компонент или переключиться с Redux на другое решение для управления состоянием.

Есть ли преимущества хуков перед connect() в отношении качества программного обеспечения?


person hendra    schedule 23.01.2020    source источник
comment
Какие параметры вы придерживаетесь в отношении качества программного обеспечения?   -  person Fernando Montoya    schedule 23.01.2020
comment
Вы всегда можете следовать подходу «Контейнер-презентация», использовать перехватчики в контейнере, передавать данные в презентационные компоненты. Преимущество хуков в том, что они являются будущим React, использование HoC, вероятно, исчезнет в будущем.   -  person Fernando Montoya    schedule 23.01.2020


Ответы (2)


И connect, и useSelector/useDispatch - допустимые способы взаимодействия с хранилищем Redux из ваших компонентов React. Однако у них разные компромиссы. Я говорил об этих компромиссах в своем посте Мысли о React Hooks, Redux и разделение проблем, и мой доклад о ReactBoston 2019 на Крючки, HOC и компромиссы.

Подводя итог: да, хуки в целом ведут к компонентам, которые делают больше внутренне, по сравнению с отдельными компонентами, которые делают разные вещи. Оба подхода действительны - это вопрос того, что вы конкретно хотите спроектировать свою систему.

Что касается «преимуществ»: ловушки React-Redux требуют написания меньшего объема кода, чем connect, не добавляют косвенности и их легче использовать с TypeScript.

person markerikson    schedule 23.01.2020

Лично я настоятельно рекомендую использовать хуки вместо connect()() по следующим причинам:

  • Может быть легко вложен в другие пользовательские хуки для создания сложного поведения, чего нельзя сделать с connect()()
  • Легче добавлять / удалять компонент во время кодирования и рефакторинга - семантика менее разрушительна (вы по-прежнему экспортируете то же самое)
  • Разделение проблем - если ваш компонент использует несколько разных битов состояния редукции, все они поступают через одну mapStateToProps функцию, тогда как вы можете создать несколько хуков для разных битов состояния редукции.
  • Упрощает дерево React - connect()() эффективно отображает два элемента React: «тупой» элемент и связанный. Это делает ваше дерево вдвое более вложенным!
  • Более интуитивно понятный синтаксис - я часто обращаюсь к документации с помощью connect()(), хотя я использовал его сотни раз.

Согласитесь, что хуки немного более связаны, чем connect()() - если вас это беспокоит, вы можете добавить уровень абстракции:

import { useBadgers } from '../reducers/badgers';

function MyBadgerList() {
    const badgers = useBadgers();
}

с участием

// ../reducers/badgers.js
export const useBadgers = () => useSelector(state => state.badgers);
person Duncan Thacker    schedule 23.01.2020
comment
Могу ли я действительно узнать, как вложение с HOC может повлиять на производительность приложения? Среднестатистический компонент в работе подобен миллиону подключенных HOC connect(mapStateToProps, mapDispatchToProps)(WithErrorBoundary(withStyles(styles)(withRouter(Component)))) Я знаю, что все, кроме границы ошибки, имеют замену перехватчика, но мне нужна какая-то статистика / мера профилирования, чтобы дать нам время для рефакторинга. - person Ahmed Mohamedeen; 26.11.2020