なぜmapDispatchToProps
有用なのか、答えが明確になっていないように思います。
これは実際にはcontainer-component
パターンのコンテキストでのみ答えることができます。これは、最初に「コンテナコンポーネント」、次に「Reactでの使用法」を読むことで最もよく理解できました。
一言で言えば、あなたcomponents
はものを表示することだけに関心があるはずです。それらはからの情報を取得することになっている唯一の場所は、彼らの小道具です。
「ものを表示する」(コンポーネント)とは次のとおりです。
それ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>
}
}
このコンポーネントがどのようにプロップから表示する情報を取得するかを確認します(これはを介してreduxストアから取得されますmapStateToProps
)。また、そのアクション関数をプロップから取得します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、ディスパッチ、ストア、ステートなどについて知っているのはcontainer
1つです。
component
パターン、中FancyAlerter
にはでコールにそのメソッドを取得します:レンダリングがその原料のいずれかについて知る必要はありませんん、onClick
ボタンの、その小道具を経由して。
そして... mapDispatchToProps
は、コンテナーがその機能を小道具のラップされたコンポーネントに簡単に渡すためにreduxが提供する便利な手段でした。
これはすべて、ドキュメントのtodoの例と、ここでの別の回答に非常に似ていますが、理由を強調するためにパターンに照らしてキャストしようとしました。
(注:内部にアクセスできないという基本的な理由とmapStateToProps
同じ目的で使用することはできません。そのため、ラップされたコンポーネントにを使用するメソッドを提供するために使用することはできませんでした。 mapDispatchToProps
dispatch
mapStateToProp
mapStateToProps
dispatch
彼らがなぜそれを2つのマッピング関数に分割することを選んだのか、私にはわかりません-IEにmapToProps(state, dispatch, props)
両方の機能を持たせるのは面倒だったかもしれません!
1FancyButtonContainer
「もの」であることを強調するために、 意図的に明示的にコンテナに名前を付けていることに注意してください。「もの」としてのコンテナのアイデンティティ(および存在)は、省略形で失われることがあります。
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
ほとんどの例に示されている構文