javascript - Reactjs 数组突变

标签 javascript reactjs

我有这个功能:

setNotActiveWalletsList = () => {
   
    const { GetAccounts } = this.props;
    let shallowCopyOfWalletsArray = [...GetAccounts]  
    const notActive = shallowCopyOfWalletsArray.filter(user => user.active !== true);


    let newArr = notActive.map(item => {

      return decryptAccountInformation(item).then(result => {
          !result.address ? null : item.address = result.address
      })
   
    });

    this.setState({ onlyNotActive: newArr });
  }

GetAccounts 是一个对象数组

问题是,我的一位同事告诉我,我正在用这一行改变数组:

 !result.address ? null : item.address = result.address

但我不太明白为什么这被认为是突变?我确定我创建了原始数组的副本并对其进行了修改。

请问有什么解决此问题的建议吗?

最佳答案

扩展语法仅对对象或数组进行一级关闭。任何深度超过一层的对象或数组仍将具有相同的引用。因此,当您使用 notActive 数组 items 时,您实际上是在处理 GetAccounts

内的相同引用

正确的更新方法是从映射函数中返回克隆和更新的引用,并使用 Promise.all 来处理异步调用

setNotActiveWalletsList = () => {
   
    const { GetAccounts } = this.props;
    let shallowCopyOfWalletsArray = [...GetAccounts]  
    const notActive = shallowCopyOfWalletsArray.filter(user => user.active !== true);


    let promises = notActive.map(item => {

      return decryptAccountInformation(item).then(result => {
          return !result.address ? item : {...item, address: result.address}
      })
   
    });
    Promise.all(promises).then(newArr => this.setState({ onlyNotActive: newArr }));
    
  }

关于javascript - Reactjs 数组突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66585490/

相关文章:

javascript - 将 Ember 组件插入特定的 DOM 元素?

javascript - Vue.js eslint 解析错误。 : unexpected token

reactjs - 流类型 React ref 回调和 createRef

reactjs - 将 HTMLElement 转换为 React Element,并保留任何事件监听器

javascript - 选择并更改 ReactJS 中的特定元素

reactjs - 对话框打开时,material-ui 菜单未关闭

javascript - React 中的高阶组件(自身)包装

javascript - React JS 复选框无法识别第一个切换

javascript - CKEditor - 格式化编辑器显示将撇号更改为 lsquo

javascript - 我如何使用 javascript 获取页面上包含特定单词的链接