Я пытаюсь понять метод подключения к реактиву-редуксу и функции, которые он принимает в качестве параметров. В частности mapStateToProps()
.
Насколько я понимаю, возвращаемое значение mapStateToProps
будет объектом, полученным из состояния (как оно живет в хранилище), чьи ключи будут переданы целевому компоненту (к которому применяется компонент, к которому применяется соединение) в качестве реквизита.
Это означает, что состояние, используемое вашим целевым компонентом, может иметь совершенно отличную структуру от состояния, которое хранится в вашем магазине.
Q: это нормально?
Q: это ожидается?
В: Это анти-паттерн?
javascript
reactjs
redux
react-redux
Пабло Баррия Уренда
источник
источник
this.props.someData
а неthis.props.someKey[someOtherKey].someData
... имеет смысл?Ответы:
Q:
Is this ok?
A: да
Q:
Is this expected?
Да, это ожидаемо (если вы используете реактив-редукс).
Q:
Is this an anti-pattern?
A: Нет, это не анти-паттерн.
Это называется «подключение» вашего компонента или «сделать его умным». Это по замыслу.
Это позволяет вам отделить ваш компонент от вашего состояния на дополнительное время, что увеличивает модульность вашего кода. Это также позволяет упростить состояние вашего компонента как подмножество состояния вашего приложения, что, на самом деле, помогает вам соответствовать шаблону Redux.
Подумайте об этом так: магазин должен содержать все состояние вашего приложения.
Для больших приложений это может содержать десятки свойств, вложенных во многие слои.
Вы не хотите таскать все это на каждом вызове (дорого).
Без этого
mapStateToProps
или какого-либо аналога у вас возникнет соблазн разделить ваше состояние на другой способ повышения производительности / упрощения.источник
(1) -
простой глубокий доступ.(2) -
Избегайте ошибок, когда компонент может испортить состояние, не принадлежащее емуДа, это правильно. Это просто вспомогательная функция, чтобы иметь более простой способ доступа к вашим свойствам состояния
Представьте, что у вас есть
posts
ключ в вашем приложенииstate.posts
И компонент
Posts
По умолчанию
connect()(Posts)
все параметры состояния доступны для подключенного компонента.Теперь, когда вы отображаете
state.posts
свой компонент, он становится немного лучшеmapDispatchToProps
как правило, вы должны написать
dispatch(anActionCreator())
с
bindActionCreators
вами можно сделать это также легче, какТеперь вы можете использовать его в своем компоненте
Обновление на actionCreators ..
Пример actionCreator:
deletePost
Итак,
bindActionCreators
просто приму ваши действия, заверну их вdispatch
вызов. (Я не читал исходный код Redux, но реализация может выглядеть примерно так:источник
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
действиеfetchPosts
иdeletePost
действия?state => state.posts
(mapStateToProps
функция) сообщит React, какие состояния будут вызывать повторную визуализацию компонента при обновлении.Вы правильно поняли первую часть:
Да
mapStateToProps
имеет состояние Store в качестве аргумента / параметра (предоставляетсяreact-redux::connect
) и используется для связывания компонента с определенной частью состояния хранилища.Под связью я подразумеваю, что возвращаемый объект
mapStateToProps
будет предоставлен во время строительства в качестве реквизита, и любые последующие изменения будут доступны черезcomponentWillReceiveProps
.Если вы знаете шаблон проектирования Observer, то это именно то или иное его изменение.
Пример поможет прояснить ситуацию:
Может существовать другой компонент реагирования, называемый
itemsFilters
обработчиком отображения и сохраняющий состояние фильтра в состоянии Redux Store, демо-компонент «прослушивает» или «подписывается» на фильтры состояния Redux Store, поэтому всякий раз, когда фильтры сохраняют изменения состояния (с помощьюfiltersComponent
), реагируют -redux обнаруживает, что произошло изменение, и уведомляет или «публикует» все прослушивающие / подписанные компоненты, отправляя изменения в ихcomponentWillReceiveProps
которые в этом примере вызовут повторный фильтр элементов и обновят отображение из-за того, что изменилось состояние реакции ,Дайте мне знать, если пример сбивает с толку или недостаточно ясен, чтобы дать лучшее объяснение.
Что касается: Это означает, что состояние, используемое вашим целевым компонентом, может иметь совершенно отличную структуру от состояния, которое хранится в вашем магазине.
Я не получил вопрос, но просто знаю, что состояние реакции (
this.setState
) полностью отличается от состояния магазина Redux!Состояние реакции используется для обработки перерисовки и поведения компонента реакции. Состояние реакции содержится исключительно для компонента.
Состояние Redux Store представляет собой комбинацию состояний редукторов Redux, каждое из которых отвечает за управление небольшой частью логики приложения. Эти атрибуты редукторов могут быть доступны с помощью
react-redux::connect@mapStateToProps
любого компонента! Что делает состояние хранилища Redux доступным для всего приложения, в то время как состояние компонента является эксклюзивным для самого себя.источник
Это реагировать и перевождь пример базируется на примере Мухаммеда Mellouki в. Но проверяет, используя правила prettify и linting . Обратите внимание, что мы определяем наши методы props и dispatch, используя PropTypes, чтобы наш компилятор не кричал на нас. Этот пример также включал некоторые строки кода, которые отсутствовали в примере Мохамеда. Чтобы использовать Connect, вам нужно будет импортировать его из Reaction-redux . Этот пример также связывает метод filterItems, это предотвратит проблемы области действия в компоненте . Этот исходный код был автоматически отформатирован с использованием JavaScript Prettify .
Этот пример кода является хорошим шаблоном для отправной точки для вашего компонента.
источник
React-Redux
connect
используется для обновления хранилища для каждого действия.Это очень просто и понятно объяснено в этом блоге .
Вы можете клонировать проект github или скопировать и вставить код из этого блога, чтобы понять соединение Redux.
источник
Вот схема / шаблон для описания поведения
mapStateToProps
:(Это значительно упрощенная реализация того, что делает контейнер Redux.)
и следующий
источник
}
}
источник