为了账号安全,请及时绑定邮箱和手机立即绑定

React Hooks 更新嵌套数组

React Hooks 更新嵌套数组

四季花海 2022-12-29 15:23:32
我在使用 useState 挂钩的状态中有一个名为选项的对象数组我只想更新特定索引处的嵌套数组对象。var subOptionModel = {        text: "test",        price: 0,    };    var optionModel = {        optionSetId: 0,        optionName: "",        optionPrice: 0,        editOptionName: false,        subOptions: [subOptionModel],    };    const [options, setOptions] = useState([optionModel]);我在选项状态中有多个选项,我如何更新状态,如索引 2 处的选项和 1 处的子选项,这就是我尝试的目的。setOptions(                options.map((x, index) => {                    if (index !== optionIndex) return x;                    x.subOptions.map((subItem, subIndex) => {                        console.log(subItem);                        if (subIndex !== subOptionIndex) return subItem;                        return {                            ...subItem,                            text: text                        };                    });                }),            );
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

对于这种数据模型,我宁愿使用 useReducer 钩子。就个人而言,我觉得它更干净。


但是你的问题是,你没有改变并返回你的 subOptions 。


setOptions(

  options.map((x, index) => {

      if (index !== optionIndex) return x;

      x.subOptions = x.subOptions.map((subItem, subIndex) => {

          console.log(subItem);

          if (subIndex !== subOptionIndex) return subItem;

          return {

              ...subItem,

              text: text

          };

      });


      return x;

  }),

);


查看完整回答
反对 回复 2022-12-29
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我建议您使用不变性库,例如immer.js。这将允许您精确地选择要在您的州内更新的内容。


这将允许您像这样修改您的选项:


import produce from "immer"


const newOptions = produce(options, draftOptions => {

    draftOptions[2].subOption[1] = [whatever you want]

})


setOptions(newOptions)


查看完整回答
反对 回复 2022-12-29
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

按照您的解决方案,您错过了第一个返回mapif index === optionIndex。


setOptions((options) => {

  return options.map((x, index) => {

    if (index !== optionIndex) return x;

    return {

      ...x,

      subOptions: x.subOptions.map((subItem, subIndex) => {

        if (subIndex !== subOptionIndex) return subItem;

        return {

          ...subItem,

          text: text

        };

      })

    }

  })

})


否则你可以使用类似immer.js


查看完整回答
反对 回复 2022-12-29
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信