Ответ 1
В mapStateToProps
и mapDispatchToProps
параметр ownProps
относится к реквизитам, которые компонент получает через атрибуты, например:
<AddQuestionButton isVisible={ true } />
Атрибут isVisible
будет передан как ownProps
. Таким образом, вы можете иметь компонент, который получает некоторые реквизиты от redux и некоторые реквизиты из атрибутов.
У метода connect
есть третий параметр mergeProps
:
[mergeProps (stateProps, dispatchProps, ownProps): реквизит] (функция): Если указано, ему передается результат mapStateToProps(), mapDispatchToProps() и родительский реквизит. Обычный объект, который вы возврат из него будет передан в качестве реквизита для обернутого компонента. Вы может указывать эту функцию для выбора среза состояния на основе реквизита или привязать создателей действия к определенной переменной из реквизита. Если вы опустите его, Object.assign({}, ownProps, stateProps, dispatchProps) используется по умолчанию.
В репозиториях слияния вы фактически можете объединить все реквизиты вместе, как вы можете видеть в этом ответе Дэн Абрамов на этот issue:
function mapStateToProps(state, ownProps) {
return {
isFollowing: state.postsFollowing[ownProps.id]
};
}
function mergeProps(stateProps, dispatchProps, ownProps) {
const { isFollowing } = stateProps;
const { dispatch } = dispatchProps;
const { id } = ownProps;
const toggle = isFollowing ?
unfollowPostActionCreator :
followPostActionCreator;
return {
...stateProps,
...ownProps,
toggleFollow: () => dispatch(toggle(id)))
};
}
ToggleFollowButton = connect({
mapStateToProps,
null, // passing null instead of mapDispatchToProps will return an object with the dispatch method
mergeProps
})(ToggleFollowButton)