ownProps
いくつかに基づいて reselect を使用してメモ化を行うセレクターを作成したいと思いますmapStateToProps
。
ベストアンサー1
これは、セレクタをコンポーネントに接続することで実現できますconnect
。反応Redux次に、コンポーネントのプロパティ (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;
しかし、 この意志ないプロパティを渡すコンポーネントのインスタンスが複数ある場合は、正しくメモ化する必要があります。その場合、セレクターは
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
connect に指定された引数がオブジェクトではなく関数を返す場合、その引数はmapStateToProps
コンテナの各インスタンスに対して個別の関数を作成するために使用されます。
これを念頭に置いて、makeMapStateToProps
新しいgetVisibleTodos
セレクタを作成し、mapStateToProps
その新しいセレクタに排他的にアクセスできる関数を返す関数を作成できます。
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;
これで、コンテナの各インスタンスは、プライベート セレクターを持つ独自の関数VisibleTodosList
を取得します。コンテナのレンダリング順序に関係なく、メモ化が正しく機能するようになります。mapStateToProps
getVisibleTodos
これは適応された(明らかにコピーされています)からドキュメントを再選択