首页 > 解决方案 > forEach 中用于 redux 减速器的突变(使用 immer.js)

问题描述

我找到了解决这个问题的方法,但感觉很丑。我有一个自定义道具isMultipleValid,如果那个道具是true,我需要遍历一个对象数组并在每个对象isValid:属性上设置为false

值得注意的是,我还使用(自动包含在 中),它允许我通过赋值直接改变不可变对象

我想做的事:

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
      }
   }
})

然而,这会导致错误:

分配给函数参数“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 */为这个文件做,但仍然感觉应该有一些方法来满足中间的两端

标签: javascriptreduxeslintredux-toolkitimmer.js

解决方案


推荐阅读