2016-04-15 28 views
2

与えられたURLのユーザーデータを表示する、ステートレスで機能的なUserProfileコンポーネントを考えてみましょう。 connect(mapStateToProps, mapDispatchToProps)(UserProfile)でラップされているとします。最後に、state.userProfileに縮小する減速器を考えてみましょう。いつでもURLの変更は、私はそう思い浮かぶのソリューションはそうのようなmapDispatchToProps内からそうすることで、再初期化state.userProfile行う必要があります。mapDispatchToPropsは初期化アクションをディスパッチする必要がありますか?

サンクfetchUserは、と比較することで繰り返し呼び出しを無視することを提供
function mapDispatchToProps(dispatch, ownProps) { 
    dispatch(fetchUser(ownProps.userId)) 
    return { 
    ... 
    } 
} 

現状では、これは容認できる慣行ですか?または、このマップ関数からすぐにディスパッチを呼び出すことに関連する問題はありますか?

答えて

4

これはサポートされていないため、いつでも破損する可能性があります。
mapDispatchToProps自体に副作用があってはいけません。

変更を支えるために応答してアクションをディスパッチする必要がある場合は、コンポーネントクラスを作成し、このためのライフサイクル・メソッドを使用することができます。

class UserProfile extends Component { 
    componentDidMount() { 
    this.props.fetchUser(this.props.id) 
    } 

    componentDidUpdate(prevProps) { 
    if (prevProps.id !== this.props.id) { 
     this.props.fetchUser(this.props.id) 
    } 
    } 

    // ... 

} 
+0

技術的にそれは私の知る限り理解し、まだ純粋な関数であるが、思考私は循環的な発送状況を想像することができます。確認していただきありがとうございます。 –

+1

'dispatch'を呼び出すと純粋ではありませんが、それは副作用です。 –

+0

私はそれが用語の問題だと思いますが、ウィキペディアの定義に従えば、純粋な関数は「常に同じ引数の値で同じ結果の値を評価します」。おそらくあなたが念頭に置いている別の定義があります。 –

関連する問題