如果命名不正确,Redux 选择器函数 returns 会出错

Redux Selector function returns error if not named correctly

我的 redux todo 应用程序中有这个选择器:

export const selectTodoSlice = (state) => state.todoReducer;

而且我必须按照我在商店中定义我的减速器的方式来命名这个 state.todoReducer

import todoReducer from "../features/todo/todoSlice";
const store = configureStore({
  reducer: {
    todoReducer,
  },
});

...否则我会得到关于某些 .map() 函数的错误。

所以我想知道这是否是一个约定和规则,即选择器中 return 函数的这一部分 — state.todoReducer — 必须始终与您命名并传递给您的缩减器相同商店?

当你将{ reducer: { todoReducer } }传递给configureStore时,redux会在状态中创建一个对应的属性。

createStore({
  reducer: {
    todoReducer: (state, action) => { ... },
  }
})

// redux state
{
  todoReducer: {
    // whatever todoReducer returns
  }
}

对于 reducer 中的每个 属性,你会得到一个 属性 状态:

createStore({
  reducer: {
    todoReducer: (state, action) => { ... },
    someOtherReducer: (state, action) => { ... }
  }
})

// redux state
{
  todoReducer: {
    // whatever todoReducer returns
  },
  someOtherReducer: {
    // whatever someOtherReducer returns
  }
}

您的选择器正在 returning 状态对象的命名 属性。如果状态中不存在名为 属性 的选择器,则选择器将 return 未定义。如果后续代码需要一个数组并尝试在其上调用映射,您将收到错误。

考虑:

const state = {
  todoReducer: ["one", "two", "three"]
}

// this works
const todo = state.todoReducer; // array
const allCaps = todo.map(item => item.toUpperCase());
// ["ONE", "TWO", "THREE"]

// this doesn't
const notThere = state.nonexistentProperty; // undefined
const boom = notThere.map(item => item.toUpperCase()); // error