Redux ライブラリのドキュメントを読んでいたところ、次のような例がありました。
コンテナ コンポーネントは、状態を読み取るだけでなく、アクションをディスパッチすることもできます。同様に、メソッド
mapDispatchToProps()
を受け取りdispatch()
、プレゼンテーション コンポーネントに挿入するコールバック プロパティを返す という関数を定義できます。
mapDispatchToProps
これは実際には意味がありません。すでに持っているのに、なぜ必要なのですかmapStateToProps
?
また、この便利なコードサンプルも提供されています:
const mapDispatchToProps = (dispatch) => {
return {
onTodoClick: (id) => {
dispatch(toggleTodo(id))
}
}
}
この機能とは何ですか? また、なぜ便利なのですか?
ベストアンサー1
いずれの答えも、なぜ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>
}
}
このコンポーネントが、表示する情報を 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
)
あなたにはそれがわかるだろうか、今それがcontainer
1redux や dispatch や store や state などについて知っているもの。
component
パターン内の はレンダリングFancyAlerter
を行うため、これらのことについて何も知る必要はありません。 は、onClick
ボタンの を呼び出すメソッドをそのプロパティ経由で取得します。
そして...は、mapDispatchToProps
コンテナがその関数をそのプロパティのラップされたコンポーネントに簡単に渡すことができるようにするために、Redux が提供する便利な手段でした。
これらはすべて、ドキュメントの todo の例や、ここにある別の回答と非常によく似ていますが、私はその理由を強調するために、パターンに照らしてそれを表現しようとしました。
(注:内部では にアクセスできないという基本的な理由により、 をmapStateToProps
と同じ目的で使用することはできません。したがって、を使って、ラップされたコンポーネントに を使用するメソッドを提供することはできません。mapDispatchToProps
dispatch
mapStateToProp
mapStateToProps
dispatch
なぜ 2 つのマッピング関数に分割することにしたのかはわかりません。IEmapToProps(state, dispatch, props)
の 1 つの関数で両方を実行した方がすっきりしたかもしれません。
1コンテナFancyButtonContainer
を「物」であることを強調するために意図的に明示的に と名付けたことに注意してください。コンテナの「物」としてのアイデンティティ(したがって存在!)は、省略形では失われることがあります。
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
ほとんどの例で示されている構文