私のmapStateToProps
関数では、idToken
とaccessToken
を状態に保存された値に設定しました。コンポーネントからこれらの値を参照できたので、これは機能します。 mapDispatchToProps
では、これらの小道具をアクションの引数として使用しようとしています。ただし、ownProps
は空のオブジェクトです。 idToken
とaccessToken
がないのはなぜですか?
コンテナ:
import { connect } from 'react-redux'
import { toggleAddQuestionModal, fetchFriends } from '../actions'
import AddQuestionButtonComponent from '../components/AddQuestionButton'
const mapStateToProps = (state) => {
auth = state.auth
return {
idToken: auth.token.idToken,
accessToken: auth.profile.identities[0].accessToken,
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
didPress: (idToken, accessToken) => {
dispatch(toggleAddQuestionModal(true))
dispatch(fetchFriends(ownProps.idToken, ownProps.accessToken))
}
}
}
AddQuestionButton = connect(
mapStateToProps,
mapDispatchToProps
)(AddQuestionButtonComponent)
export default AddQuestionButton
成分:
'use strict';
import React, {
Text,
View,
TouchableHighlight,
PropTypes,
} from 'react-native'
import styles from './styles'
const AddQuestionButton = ({ didPress, idToken, accessToken }) => (
<TouchableHighlight style={styles.actionButton} onPress={didPress(idToken, accessToken)}>
<Text style={styles.actionButtonText}>+</Text>
</TouchableHighlight>
)
AddQuestionButton.propTypes = {
idToken: PropTypes.string.isRequired,
accessToken: PropTypes.string.isRequired,
didPress: PropTypes.func.isRequired,
}
export default AddQuestionButton
idToken
からaccessToken
およびownProps
にアクセスできないのはなぜですか?これが誤ったパターンである場合、idToken
およびaccessToken
にどのようにアクセスする必要がありますか?
ありがとう!
mapStateToProps
およびmapDispatchToProps
では、ownProps
パラメータは、コンポーネントが属性を介して受け取る小道具を参照します。次に例を示します。
<AddQuestionButton isVisible={ true } />
isVisible
属性はownProps
として渡されます。このようにして、reduxからいくつかの小道具を受け取り、属性からいくつかの小道具を受け取るコンポーネントを持つことができます。
connect
メソッド自体には、mergeProps
と呼ばれる3番目のパラメーターがあります。
[mergeProps(stateProps、dispatchProps、ownProps):props](関数):指定すると、mapStateToProps()、mapDispatchToProps()、および親プロップの結果が渡されます。そこから返されるプレーンオブジェクトは、ラップされたコンポーネントに小道具として渡されます。この関数を指定して、小道具に基づいて状態のスライスを選択したり、アクション作成者を小道具から特定の変数にバインドしたりできます。省略した場合、Object.assign({}、ownProps、stateProps、dispatchProps)がデフォルトで使用されます。
マージプロップでは、実際にすべてのプロップを組み合わせることができます。DanAbramovによるこの回答 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)