如何在 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