mapDispatchToProps
なぜ有用なのか、答えのどれも結晶化していないように感じます。
これは実際には、container-component
パターンのコンテキストでのみ答えることができます。最初に読むことで最もよく理解できることがわかりました:コンテナー コンポーネント次にReact での使用法。
一言で言えば、あなたcomponents
はものを表示することだけに関心があるはずです. 彼らが情報を得る唯一の場所は propsです。
「ものを表示する」(コンポーネント)から分離されているのは次のとおりです。
- 表示するものを取得する方法、
- イベントの処理方法。
それcontainers
が目的です。
したがって、パターンの「よく設計された」component
は次のようになります。
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
このコンポーネントが表示する情報を props ( 経由で redux ストアからmapStateToProps
取得) から取得する方法と、その props: からアクション関数を取得する方法を確認してくださいsendTheAlert()
。
それがmapDispatchToProps
出番です:対応するcontainer
// FancyButtonContainer.js
function mapDispatchToProps(dispatch) {
return({
sendTheAlert: () => {dispatch(ALERT_ACTION)}
})
}
function mapStateToProps(state) {
return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}
export const FancyButtonContainer = connect(
mapStateToProps, mapDispatchToProps)(
FancyAlerter
)
redux、dispatch、store、state などを知っているのはcontainer
1人なので、お分かりいただけたでしょうか。
component
レンダリングを行うパターンのはFancyAlerter
、そのようなことを知る必要はありませんonClick
。小道具を介して、ボタンので呼び出すメソッドを取得します。
そして...mapDispatchToProps
コンテナがその関数を小道具のラップされたコンポーネントに簡単に渡すことができるようにするためにreduxが提供する便利な手段でした。
これはすべて、ドキュメントの todo の例と別の回答 here に非常に似ていますが、理由を強調するためにパターンに照らしてキャストしようとしました。
(注: insideにアクセスできないという基本的な理由とmapStateToProps
同じ目的で を使用することはできません。そのため、ラップされたコンポーネントに. mapDispatchToProps
dispatch
mapStateToProp
mapStateToProps
dispatch
なぜ彼らがそれを 2 つのマッピング関数に分割することにしたのかはわかりません。IE でmapToProps(state, dispatch, props)
1 つの関数で両方を行う方がよかったのかもしれません。
1FancyButtonContainer
「物」であることを強調するために、 意図的に明示的にコンテナに名前を付けたことに注意してください。
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
ほとんどの例に示されている構文