Immerjs redux reducer的forEach内部突变(使用immer.js)
我找到了一个解决这个问题的方法,但感觉很糟糕。我有一个自定义属性Immerjs redux reducer的forEach内部突变(使用immer.js),immerjs,reduxjs-toolkit,eslint,javascript,redux,redux-toolkit,immer.js,Immerjs,Reduxjs Toolkit,Eslint,Javascript,Redux,Redux Toolkit,Immer.js,我找到了一个解决这个问题的方法,但感觉很糟糕。我有一个自定义属性isMultipleValid如果该属性是true,我需要迭代一个对象数组并在每个对象上设置isValid:属性为false 值得注意的是,我还使用了 ),它允许我直接变异一个不可变的对象 带着任务 我想做的是: 但是,这会导致一个错误: 赋值给函数参数“o”的属性 { "resource": "<PATH>/quizEditorReducer.ts", "owner": "eslint", "c
isMultipleValid
如果该属性是true
,我需要迭代一个对象数组并在每个对象上设置isValid:
属性为false
值得注意的是,我还使用了
),它允许我直接变异一个不可变的对象
带着任务
我想做的是:
但是,这会导致一个错误:
赋值给函数参数“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
}
现在这会起作用,但感觉完全错了。有没有办法绕过这个
PS:是的,我知道我可以简单地对这个文件执行
/*eslint no param reassign:0*/
,但感觉应该有一些方法来满足中间的两端您可以更具选择性地禁用lint规则,并对该行执行//eslint禁用下一行no param reassign
。您使用的库支持+鼓励变异,但您有一个lint规则阻止它。其中一个必须赢。您可以采用一种不变的方法,使用.map
而不是.forEach
,但这在某种程度上会破坏使用immer的目的。禁用lint规则似乎是个不错的选择。我对immer.js一点也不熟悉,但这可能会有所帮助question.questionOptions.map(o=>Object.assign(o,{isValid:false}))
在禁用lint规则并仅对该行执行//eslint禁用下一行无参数重新分配时,您可以更具选择性。您使用的库支持+鼓励变异,但您有一个lint规则阻止它。其中一个必须赢。您可以采用一种不变的方法,使用.map
而不是.forEach
,但这在某种程度上会破坏使用immer的目的。禁用lint规则似乎是个不错的选择。我对immer.js一点也不熟悉,但这可能会有所帮助question.questionOptions.map(o=>Object.assign(o,{isValid:false}))
{
"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
}
}
})