Javascript 组件没有';设置状态后不更新

Javascript 组件没有';设置状态后不更新,javascript,reactjs,react-native,react-native-ios,Javascript,Reactjs,React Native,React Native Ios,我用字典在每张卡片上储存类似的帖子 constructor(props) { super(props); this.state = { like_dict: {} }; this.likeClicked = this.likeClicked.bind(this) } 我在每张卡片上都有一个like按钮,文本表示like的数量 <Button transparent onPress={() => {this.likeClicked(poid, 0)}}>

我用字典在每张卡片上储存类似的帖子

constructor(props) {
  super(props);
  this.state = {
    like_dict: {}
  };
  this.likeClicked = this.likeClicked.bind(this)
}
我在每张卡片上都有一个like按钮,文本表示like的数量

<Button transparent onPress={() => {this.likeClicked(poid, 0)}}>
    <Icon name="ios-heart-outline" style={{ color: 'black' }} />
</Button>
<Text>{this.state.like_dict[poid]}</Text>

您需要在修改状态之前复制它。您所做的只是在like_dict_tmp中创建一个指向状态的链接(或者使用我下面所做的,或者使用concat和空数组):

var like_dict_tmp=this.state.like_dict.concat([])


而且,{}在JS中是一个对象,通常不称为字典

在修改它之前,需要复制状态。您所做的只是在like_dict_tmp中创建一个指向状态的链接(或者使用我下面所做的,或者使用concat和空数组):

var like_dict_tmp=this.state.like_dict.concat([])


而且,{}在JS中是一个对象,通常不称为字典

React的关键原则之一是从不直接改变状态

当您执行
var like_dict_tmp=this.state.like_dict
时,
like_dict_tmp
正在引用状态中的同一对象,因此更改
like_dict_tmp
将直接改变状态,因此后续的
setState
将不会更新组件

您可以使用
var like_dict\u tmp={…this.state.like_dict}
创建一个浅拷贝,或者用以下内容替换整个函数:

this.setState((prevState) => ({
  like_dict: {
    ...prevState,
    [poid]: (prevState[poid] || 0) + (liked ? 1 : -1),
  },
}));

React的关键原则之一是决不直接改变状态

当您执行
var like_dict_tmp=this.state.like_dict
时,
like_dict_tmp
正在引用状态中的同一对象,因此更改
like_dict_tmp
将直接改变状态,因此后续的
setState
将不会更新组件

您可以使用
var like_dict\u tmp={…this.state.like_dict}
创建一个浅拷贝,或者用以下内容替换整个函数:

this.setState((prevState) => ({
  like_dict: {
    ...prevState,
    [poid]: (prevState[poid] || 0) + (liked ? 1 : -1),
  },
}));

如果您想了解更多,请查看此链接,特别是基本体与对象以及按引用传递与按值传递。如果您想了解更多,请查看此链接,特别是基本体与对象以及按引用传递与按值传递。谢谢您通知我。我尝试了这种方法,但它仍然没有更新。它根本没有更新,还是没有按预期的那样更新?我可以想象的一个问题是,在构造函数中,您没有定义poid,然后您尝试用您喜欢的方法对其进行添加/减去。您是否尝试了上面的my
setState
代码块?在原始代码中,当
prevState[poid]
undefined
时,您没有提供默认值,因此执行
undefined+1
将始终返回
NaN
。感谢您的通知。我尝试了这种方法,但它仍然没有更新。它根本没有更新,还是没有按预期的那样更新?我可以想象的一个问题是,在构造函数中,您没有定义poid,然后您尝试用您喜欢的方法对其进行添加/减去。您是否尝试了上面的my
setState
代码块?在原始代码中,当
prevState[poid]
undefined
时,您没有提供默认值,因此执行
undefined+1
操作将始终返回
NaN
this.setState((prevState) => ({
  like_dict: {
    ...prevState,
    [poid]: (prevState[poid] || 0) + (liked ? 1 : -1),
  },
}));