如何在redux reducer中使用reselct选择器

bur*_*ish 7 redux reselect

我的应用程序已经有各种容器对象使用的大量选择器.这些非常适合访问州的不同部分,并使重构状态更容易.

现在我想在我的一些reducer函数中使用我的选择器.问题是在reducer中,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
  }
}
Run Code Online (Sandbox Code Playgroud)

Yur*_*nko 8

您的选择器从根状态对象工作.

要伪造这个,你可以做到

 return getUncompletedTodos({todos: state});
Run Code Online (Sandbox Code Playgroud)

但恕我直言,更好的想法是重用过滤功能

/* 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);
Run Code Online (Sandbox Code Playgroud)

  • @ user2602152您正在调用reducer来改变状态.这里的Memoization就像总是缺少缓存. (3认同)
  • 我认为这不是一个好主意。引用:“您正在调用reducer来改变状态。这里的记忆就像总是缺少缓存。”这不是真的。因为此刻我调用选择器,所以尚未执行突变。因此,我应该能够利用备忘录。 (3认同)
  • 为什么您不想利用 getUncompletedTodos-selector 中的记忆功能? (2认同)