私のアプリには、さまざまなコンテナーオブジェクトによって使用されるセレクターの大規模なコレクションが既にあります。これらは、状態のさまざまな部分にアクセスし、状態のリファクタリングをはるかに簡単にするのに最適です。
次に、一部のリデューサー関数内でセレクターを使用したいと思います。問題は、レデューサー内でstate
パラメーターが状態の特定のスライスを参照するのに対し、セレクター関数は状態のルートオブジェクトで呼び出されることを期待していることです。
考案された例:
/* Selectors */
const getTodos = state => state.todos;
const getUncompletedTodos = createSelector(
[ getTodos ],
todos => todos.filter(t => !t.completed)
);
/* Reducer */
const todosReducer = (state, action) => {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
id: action.id,
text: action.text,
completed: false
}
];
case 'REMOVE_COMPLETED_TODOS':
return getUncompletedTodos(state); // <-- this won't work
}
}
セレクターはルート状態オブジェクトから機能します。
これを偽造するには、あなたがすることができます
return getUncompletedTodos({todos: state});
しかし、私見より良いアイデアは、フィルタリング機能を再利用することです
/* Selectors */
const getTodos = state => state.todos;
const filterCompleted = todos => todos.filter(t => !t.completed)
const getUncompletedTodos = createSelector(
[ getTodos ],
filterCompleted
);
// inside reducer
case 'REMOVE_COMPLETED_TODOS':
return filterCompleted(state);