javascript - forEach 中用于 redux 减速器的突变(使用 immer.js)
问题描述
我找到了解决这个问题的方法,但感觉很丑。我有一个自定义道具isMultipleValid
,如果那个道具是true
,我需要遍历一个对象数组并在每个对象isValid:
属性上设置为false
值得注意的是,我还使用了 immerjs(自动包含在 reduxjs-toolkit中),它允许我通过赋值直接改变不可变对象
我想做的事:
const reducer = createReducer({//...}, {
[someAction.type]: (state, action) => {
const { questionId, isMultipleValid } = action.payload;
const question = state.find((q) => q.id === questionId);
if (question) {
if (!isMultipleValid) {
question.questionOptions.forEach((o) => {
o.isValid = false;
}
}
// ... more code here, but skipped for readability
}
}
})
然而,这会导致eslint错误:
分配给函数参数“o”的属性。
{ "resource": "<PATH>/quizEditorReducer.ts", "owner": "eslint", "code": "no-param-reassign", "severity": 8, "message": "Assignment to property of function parameter 'o'.", "source": "eslint", "startLineNumber": 39, "startColumn": 11, "endLineNumber": 39, "endColumn": 12 }
需要做什么:
现在感觉很丑陋,有一种解决方法可以简单地将值重新分配给一个临时变量,如下所示:
const reducer = createReducer({//...}, {
[someAction.type]: (state, action) => {
const { questionId, isMultipleValid } = action.payload;
const question = state.find((q) => q.id === questionId);
if (question) {
if (!isMultipleValid) {
let temp;
question.questionOptions.forEach((o) => {
temp = o;
temp.isValid = false;
}
}
// ... more code here, but skipped for readability
}
}
})
现在这将起作用,但感觉完全错误。有没有办法绕过这个?
PS:是的我知道我可以简单地/* eslint no-param-reassign: 0 */
为这个文件做,但仍然感觉应该有一些方法来满足中间的两端
解决方案
推荐阅读
- php - 防止用户在未完成表单的情况下访问提交页面
- java - Camel Kafka 版本 2.14.3 无法读取消息
- azure-functions - 检查 Azure Durable Functions 活动函数是否存在
- javascript - 反应路由器中的路由器配置
- python - 为什么 AES 返回不同的加密?
- sql - 如何在 SQL 中编写查询?
- python-3.x - pip install fastapi[all] 由于生锈组件而失败?
- oracle - 添加间隔每月分区
- algorithm - 如何从给定数组生成不同的组合,以使序列中的每个数字也是不同的
- html - CSS 按钮生成器代码不会将效果应用于 html 文件