2016-04-03 4 views

答えて

17

react-reduxで提供されるconnectメソッドを使用してセレクタをコンポーネントに接続し、コンポーネントprops(ownProps)をセレクタの第2引数として渡します。

container.js

import { connect } from 'react-redux'; 
import { getVisibleTodos } from './selectors'; 

... 

const mapStateToProps = (state, props) => { 
    return { 
    todos: getVisibleTodos(state, props), 
    }; 
}; 

const VisibleTodoList = connect(
    mapStateToProps, 
)(TodoList); 

export default VisibleTodoList; 

次に、あなたのセレクタにそれらの小道具にアクセスすることができます

selectors.js

import { createSelector } from 'reselect'; 

const getVisibilityFilter = (state, props) => 
    state.todoLists[props.listId].visibilityFilter; 

const getTodos = (state, props) => 
    state.todoLists[props.listId].todos; 

const getVisibleTodos = createSelector(
    ... 
); 

export default getVisibleTodos; 

Howeve r、これはではありません。は、小道具を渡しているコンポーネントのインスタンスが複数ある場合は正しくメモします。その場合、セレクタは毎回異なるprops引数を受け取るため、キャッシュされた値を返す代わりに常に再計算されます。

メモ化を保持小道具に通過させながら複数のコンポーネントを横切ってセレクタを共有するために、コンポーネントの各インスタンスは、セレクタの独自のプライベートコピーが必要です。

これを行うには、呼び出されるたびにセレクタの新しいコピーを返す関数を作成します。

selectors.js

import { createSelector } from 'reselect'; 

const getVisibilityFilter = (state, props) => 
    state.todoLists[props.listId].visibilityFilter; 

const getTodos = (state, props) => 
    state.todoLists[props.listId].todos; 

const makeGetVisibleTodos =() => { 
    return createSelector(
    ... 
); 
} 

export default makeGetVisibleTodos; 

mapStateToProps引数が戻りを代わりにオブジェクトの機能を接続するために供給される場合、容器のインスタンスごとに個別mapStateToProps関数を作成するために使用されます。念頭に置いて

、新しいgetVisibleTodosセレクタを作成する機能makeMapStateToPropsを作成し、新しいセレクタへの排他的アクセス権を持っているmapStateToProps機能を返すことができます。VisibleTodosList

import { connect } from 'react-redux'; 
import { makeGetVisibleTodos } from './selectors'; 

... 

const makeMapStateToProps =() => { 
    const getVisibleTodos = makeGetVisibleTodos(); 
    const mapStateToProps = (state, props) => { 
    return { 
     todos: getVisibleTodos(state, props), 
    }; 
    }; 
    return mapStateToProps; 
}; 

const VisibleTodoList = connect(
    makeMapStateToProps, 
)(TodoList); 

export default VisibleTodoList; 

今すぐ各インスタンスをコンテナはgetVisibleTodosセレクタを持つ独自のmapStateToProps関数を取得します。 Memoizationは、コンテナのレンダリング順序に関係なく正しく機能するようになりました。私はmakeGetVisibleTodos(にパラメータを追加したい場合はどのような):


これはReselect documentation

+0

こんにちはから(blatentlyコピー)を適応させた、私はこのことについて疑問を持っていますか?同じパラメーター化セレクターを使用する2つのコンポーネントがあるとしましょうが、それらの小道具の命名は異なります。この場合、基本的な 'getTodos'と' getVisibilityFilter'が失敗するため、これは機能しません。 例: 'betterFoobar =(ID)=> createSelector(foobarSelector、(foobarValue)=> ID + foobarValue)' 私の考えこれまで: 'mapStateToProps = createStructuredSelector({enhancedFooBar:(状態、ownProps)=> betterFoobar( ownProps.id)(state、ownProps)}) 'しかし、私はこれをメモしないと思います。 –

+0

セレクタのownPropsに依存すると、ReactコンポーネントAPIがReduxステートセレクタに強く結合されるので、私はこの点を明確にするためにこの質問をします。セレクタは非常に強力な再利用性ツールですが、セレクタはコンポーネント間で再利用できません。例えば、私はセレクタをメインプロセスとレンダリングプロセスの両方で電子の複数のコンポーネントで使用したいと考えています。受け入れられた解決策はこの場合には適していないと思われます(当然のことながら、最初の質問に答えるだけで、私のユースケースではいくつかの変更が必要です)。 –

関連する問題