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

创建新数组与在反应中修改相同的数组

创建新数组与在反应中修改相同的数组

慕盖茨4494581 2022-07-08 18:02:12
以下是一段运行良好的代码,但我有一个疑问 - const _detail = detail;map 方法中的代码。在这里您可以看到我正在迭代一个数组并修改对象,然后将其设置为setState().代码块 -checkInvoiceData = (isUploaded, data) => {    if (isUploaded) {        const { invoiceData } = this.state;        invoiceData.map(invoiceItem => {            if (invoiceItem.number === data.savedNumber) {                invoiceItem.details.map(detail => {                    const _detail = detail;                    if (_detail.tagNumber === data.tagNumber) {                        _detail.id = data.id;                    }                    return _detail;                });            }            return invoiceItem;        });        state.invoiceData = invoiceData;    }    this.setState(state);};这种方法在React世界上是否可行,或者我应该做类似的事情 -const modifiedInvoiceData = invoiceData.map(invoiceItem => {  ......   code  ......})this.setState({invoiceData: modifiedInvoiceData});每种方法的优缺点是什么?在采用其中一种方法时我需要牢记哪种情况?
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

也许尝试这样的事情:


checkInvoiceData = (isUploaded, data) => {

  // Return early

  if (!isUploaded) return


  const { invoiceData } = this.state;


  const updatedInvoices = invoiceData.map(invoiceItem => {

    if (invoiceItem.number !== data.savedNumber) return invoiceItem


    const details = invoiceItem.details.map(detail => {

      if (detail.tagNumber !== data.tagNumber) return detail


      return { ...detail, id: data.id };

    });


    return { ...invoiceItem, details };

  });


  this.setState({ invoiceData: updatedInvoices });

};

首先,我建议尽早返回而不是嵌套条件。


其次,确保您没有state直接变异(例如 no this.state = state)。


第三,将你想要改变的状态部分,而不是整个状态对象,传递给setState.


第四,返回对象的一个新实例,以便对象引用更新,以便 React 可以检测到值的变化。


我并不是说这是做你想做的最好的方法,但它应该为你指明一个更好的方向。


查看完整回答
反对 回复 2022-07-08
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您不能改变状态,而是可以执行以下操作:


checkInvoiceData = (isUploaded, data) => {

  if (isUploaded) {

    this.setState({

      invoiceData: this.state.invoiceData.map(

        (invoiceItem) => {

          if (invoiceItem.number === data.savedNumber) {

            invoiceItem.details.map(

              (detail) =>

                detail.tagNumber === data.tagNumber

                  ? { ...detail, id: data.id } //copy detail and set id on copy

                  : detail //no change, return detail

            );

          }

          return invoiceItem;

        }

      ),

    });

  }

};


查看完整回答
反对 回复 2022-07-08
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号