【问题标题】:Updating property of object within stored array - React Native更新存储数组中对象的属性 - React Native
【发布时间】:2018-09-23 20:32:29
【问题描述】:

我正在使用react-native-simple-store 并编写了以下函数来更新存储在对象数组中的所提供对象的属性。为此,我使用了issue #31 中提到的方法来删除项目。

问题是因为我使用的是 .push,更新一个项目会导致它呈现在数组的底部。这会导致项目在 FlatList 中不必要地移动。

是否有更有效的方法来更新数组中对象的属性(使用 .push 不会导致此问题)?

plusProgress = (itemId, progress) => {
  const foods = this.state.foods.filter(({ id }) => itemId !== id);
    const updatedItem = {
      itemId,
      progress: progress + 1
    };
  foods.push(updatedItem);
  this.setState({ foods });
  store.save('foods', foods);
}

【问题讨论】:

  • 什么是store
  • store 是对 AsyncStorage 的导入包装器的引用(来自 react-native-simple-store)。
  • 所以这样可以将数据更永久地保存在数据库或文件系统中?

标签: arrays reactjs object react-native


【解决方案1】:

你可以尝试不可变的添加到数组

foods.concat(updatedItem);

更多关于变异和非变异数组方法的信息在这里 https://lorenstewart.me/2017/01/22/javascript-array-methods-mutating-vs-non-mutating/

【讨论】:

    【解决方案2】:

    与其从列表中删除对象,不如将其替换为更新版本:

    plusProgress = (itemId, progress) => {
        const foods = this.state.foods.map(food => {
            if (itemId === food.id) {
                return Object.assign({}, food, {progress: progress + 1});
            }
    
            return item;
        });
    
        this.setState({foods});
    }
    

    为了更准确,您可能应该从plusProgress() 中删除progress 参数并改用item.progress。这可确保您增加当前进度值,而不是依赖于将不相关的值传递给函数。

    【讨论】:

    • 您好,感谢您的回复,当我使用它时,它会将我的对象的 id 更改为未定义,迫使我不得不重置存储
    • @garethiv 我可能没有完全正确的代码。不过,基本概念是合理的:使用正确位置的更新对象创建一个新数组,然后使用该新数组调用setState()。我留给您填写正确的详细信息并调试代码。请注意,很难给出完全正确的答案,因为您没有提供组件的完整定义。我从非常有限的信息中推断出this.state 的形状。
    • 知道了,我会弄个小鼓,看看能不能破解...this.state.foods 是一个对象数组,每个对象有 7 个属性。
    • 这些属性之一是id,对吗?仔细检查您是否正确复制了我的答案中的代码。我看不出为什么这段代码应该将id 设置为未定义。您的代码中的其他地方可能存在错误。
    【解决方案3】:

    使用正确位置的更新对象创建一个新数组,然后使用该新数组调用 setState()。如果不是您要更新的项目,请确保按原样返回当前项目。否则,数组元素将被null替换

      plusProgress = (itemId, progress) => {
    
      const foods = this.state.foods.map(item => {
        if (item.itemId === itemId) {
          return Object.assign({}, item, {progress: progress + 1});
        } 
        return item      
      })
    
      this.setState({ foods: foods })
    }
    

    【讨论】:

    • 我读过直接改变状态值是不安全的。请注意,const foods不是副本。它是对来自this.state 的数组的引用。
    • 感谢@Code-Apprentice!我无法评论您的解决方案。所以,我重写了我的解决方案来修复你代码中的一个小错误。
    • 太棒了!是的,这是我错过的部分。那我就删掉我的答案。
    • @Code-Apprentice 感谢您的回复,当我运行此函数时,它会删除分配给 progress: 的值,即它从progress: 0progress: 而不是progress: 1
    • @garethiv progress: 是什么意思?你在哪里看到这个?函数是怎么调用的?什么作为progress 参数传递?需要这个参数吗?你可以改用item.progress 吗?
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2020-12-30
    • 2021-09-24
    • 2020-08-09
    • 2019-12-15
    相关资源
    最近更新 更多