首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从produce返回数组值| immer.js

从produce返回数组值| immer.js
EN

Stack Overflow用户
提问于 2020-08-24 18:13:03
回答 1查看 150关注 0票数 0

我使用immer.js在状态中的数组上执行操作。

数组: basicRecipe和recipeBasicRecipe。

我正在修改produce函数中的draft.basicRecipe。我的目标是返回更新后的"draft.basicRecipe“值并将其存储在temparray1中。

代码语言:javascript
复制
    let temparray1 = produce(state, draft => {
      
      draft.basicRecipe = draft.basicRecipe.map(item => {
        let element = draft.recipeBasicRecipes.find(e => e._id === item._id);
        console.log(element);
        if (element) {
          item.details = item.details.map(e => {
            let detail = element.details.find(d => d._id === e._id);
            if (detail) {
              e.rate = detail.rate;
            }
            return e;
          });
        }
        return item;
      });
      return draft.basicRecipe;
    });

    console.log(temparray1);

当我返回草稿时,我能够看到更新的basicRecipe嵌套在输出中。当我尝试返回数组(即draft.basicRecipe )时,会出现以下错误

代码语言:javascript
复制
 [Immer] An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft
EN

回答 1

Stack Overflow用户

发布于 2020-10-22 11:26:32

这段代码乱七八糟。您正在使用map,它返回一个新的数组,但是您还试图改变原始的draft对象。

这仍然是不可读和令人困惑的,但至少通过使用forEach而不是map,我们只是在改变,而不是试图同时做两件事。

代码语言:javascript
复制
let temparray1 = produce(state, (draft) => {
  draft.basicRecipe.forEach((item) => {
    let element = draft.recipeBasicRecipes.find((e) => e._id === item._id);
    if (element) {
      item.details.forEach((e) => {
        let detail = element.details.find((d) => d._id === e._id);
        if (detail) {
          e.rate = detail.rate;
        }
      });
    }
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63559024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档