React Native - 无法单独更新项目内的新状态

React Native - Unable to update a new state inside items individually

我从一个 api 中提取了数据,里面有一个练习列表,这里是一个练习对象示例。

    {
        pivot_id:1,
        id:1,
        image_path: "exercise\/images\/q3YaO7uuFYgZDFg7fnVpn3eYxrb5oUZeKwE6mNf7.png",
        name:"Smitham PLC",
        duration:423,
        duration_per_rep:5,
        intensity:{
          id:2,
          intensity: "Moderate Resistance Training",
          met_value:4.5
        },
        image:"https:\/\/s3-eu-west-1.amazonaws.com\/fitness-concierge\/exercise\/images\/q3YaO7uuFYgZDFg7fnVpn3eYxrb5oUZeKwE6mNf7.png",
        kcal:5,
  },

我创建了一个默认值为 60 的 customDuration 状态,我想通过使用按钮添加一个持续时间为 30 秒的持续时间来将其添加到每个练习对象。但是,我在更新一个特定项目时遇到了问题。

例如,我渲染了两个项目,当我按下 + 按钮为它添加 30 秒的练习时,它从 60 秒变为 90 秒,但是当我去添加一些时间时列表中的第二项将从 60 到 120,这是问题发生的地方。

 addDuration(item, index) {
    let newArray = [...this.state.warm_up_exercises];
    newArray[index] = { 
        ...newArray[index], 
        customDuration: this.state.customDuration = this.state.customDuration + 30,
        storeValues: true,
        workoutStoreType: 'duration',
    };
    this.setState({
        warm_up_exercises: newArray,
    });
}

以上是我用来为练习添加持续时间的函数,我尝试执行 item.customDuration = item.customDuration + 30 但我只是在控制台中得到 NaN。

在我的映射函数中,自定义持续时间显示如下

<Text>{{ item.customDuration }}</Text>

几天来我一直在努力解决这个问题,非常感谢您的帮助。我想要实现的只是让它在我将值添加到数组时,它会更新该项目并且对其他项目没有影响。

提供更多上下文的附加代码:

My constructor:

constructor(props) {
  super(props) {
    warm_up_exercises: [],
    selected_warm_up_exercises: [],
    repsValue: 0,
    setsValue: 0,
    restValue: 0,
    workoutStoreType: "",
    customDuration: 60,
  }
}
Were I call the function: 

<TouchableOpacity onPress={() => this.addDuration(item, index)}>
   <AntDesign name="pluscircle" size={22} color={Colours.type.primary_colour}  />
</TouchableOpacity>

首先,您没有正确初始化您的状态。它应该是一个对象,其中的练习数组为 属性。这样写:

constructor(props) {
  super(props) {
    this.state = {
     exercises: [],
     repsValue: 0,
     setsValue: 0,
     restValue: 0,
     workoutStoreType: "",
     customDuration: 60,
    }
  }
}

每次增加状态时,您不仅在改变它,而且还为每个实体设置了 customDuration。问题出在这里:

customDuration: this.state.customDuration = this.state.customDuration + 30

为了正确执行,您只需要写:

customDuration: this.state.customDuration + 30

然后,要增加状态,您应该单独进行:

this.setState({
        exercises: newArray,
        customDuration: this.state.customDuration + 30
    });

如果您需要为每个项目设置 customDuration,您还需要以相同的方式更改状态,但有一点不同:

addDuration(item, index) {
    let newArray = [...this.state.exercises]
    newArray[index] = {
        ...newArray[index],
        customDuration: newArray[index].customDuration ? newArray[index].customDuration + 30 : 90,
        storeValues: true,
        workoutStoreType: 'duration',
    };
    this.setState({
        exercises: newArray,
    });
}

然后从初始状态中删除 customDuration。这样你将递增 30 并在第一次递增时输入 90