开发者问题收集

如何在 createSelector 函数中封装逻辑?

2022-05-01
247

我有一个使用 Redux 的 React Native 应用程序。

我希望能够在该项目列表的开头添加一个条目 但它不起作用。

下面提供部分代码。

这是我收到的错误:

TypeError:undefined 不是对象(评估“projects.list.push”)

我这里没有显示正确的语法?

提前致谢。

initialState: {
    list: [],
    loading: false,
    lastFetch: null,
  },


export const getPickerList = createSelector(
  (state) => state.entities.projects,
  (projects) => projects.list.push({ project_id: 0, project_name: "[All]" }),
  (projects) =>
    projects.list.filter((project) => ({
      project_id: project.project_id,
      project_name: project.project_name,
    }))
);
2个回答

我认为您实际上想要这样做:

export const getPickerList = createSelector(
  (state) => state.entities.projects,
  (projects) => {
    const projectsWithPrefix = [
      { project_id: 0, project_name: "[All]" },
      ...projects
    ];
    // you could filter here as well before returning
    return projectsWithPrefix 
  }
);

但老实说,我 不知道 您在那里用 .filter 尝试什么。

通常,您无法像您想象的那样“链接”。除最后一个函数外,所有函数的所有返回值都作为参数传递到 最后一个 函数中, 而不是下一个

phry
2022-05-01

这里有两个错误,另外我认为还有一个概念问题。

第一个问题是 您正在通过调用 projects.list.push() 来主动改变 projects.list 使用 Redux 时绝不能改变状态

第二个问题是 所有 输入选择器都使用 相同 的参数进行调用。因此,如果您调用 selectSomeThing(state, "a', 42) ,则所有输入选择器都将使用 state, "a", 42 进行调用。

这意味着第二个输入选择器的第一个参数实际上是 state ,而不是 projects

另一个问题是选择器不是“添加”任何内容的正确位置。这听起来像是状态更新,所有状态更新都必须在 Reducer 中进行。

markerikson
2022-05-01