React, 2 setstate in same function: 第二个擦除第一个
React, 2 setstate in same function: second one erase the first
我正在尝试 运行 上面的代码,但状态仅针对 idx 进行更新。据我了解,第二个函数的 setState 不会获得更新状态,这就是发生这种情况的原因。有没有办法让它正常工作(期待而不是将 2 个功能合并为一个)
doIt(idx,array) {
this.doFirst(array);
this.doSecond(idx);
}
doFirst(array){
//bla bla bla code
this.setState(test: {...this.state.test, array});
}
doSecond(idx) {
// bla bla bla code
this.setState(test: {...this.state.test, idx});
}
很难准确判断,因为您的示例 setState 调用不太正确,this.setState(test: {...this.state.test, idx});
。你是说你在做 this.setState({test: {...this.state.test, idx}});
?如果是这样,您应该使用回调而不是像这样的对象:
this.setState(() => ({ test: {...this.state.test, idx}})
下面两条语句同时执行。
this.doFirst(array);
this.doSecond(idx);
这两个调用 setState
.setState is asynchronous
。因此,无法保证值会按顺序更新。
由于这场比赛,价值被覆盖了。
更好地链接这些调用。
doIt(idx,array) {
this.doFirst(array);
}
doFirst(array){
//bla bla bla code
this.setState({test: {...this.state.test, array}},()=>{
this.doSecond(idx);
});
}
doSecond(idx) {
this.setState({test: {...this.state.test, idx}});
}
setState() 是异步的。
Think of setState() as a request rather than an immediate command to
update the component. For better perceived performance, React may
delay it, and then update several components in a single pass. React
does not guarantee that the state changes are applied immediately.
它接受一个可选的回调函数,该函数将在 setState 完成并重新呈现组件后执行。你可以使用那个回调。
如果下一个状态依赖于前一个状态,建议使用updater函数形式setState(updater[ callback])
doIt(idx,array) {
this.doFirst(array, () => this.doSecond(idx));
}
doFirst(array, callback){
//bla bla bla code
this.setState(firstUpdaterFunction, callback);
}
doSecond(idx) {
// bla bla bla code
this.setState(2ndUpdaterFunction);
}
参考文献:
https://reactjs.org/docs/react-component.html#setstate
我假设您只是将括号放错了状态对象,所以我添加了这些。
无论如何,您想改用更新程序功能:
this.setState((prevState, props) => ({test: {...prevState.test, array}});
请注意,这可能不是您想要的,因为在 ES 2015 中它转换为:
this.setState((prevState, props) => ({test: {...prevState.test, array: array}});
您也想对其他功能做同样的事情。 React 批处理将状态调用设置在一起,因此如果您不使用更新程序,您可能会为连续的函数调用访问陈旧状态。这可能就是这种情况下发生的情况。
正如其他人已经指出的那样,setState
是异步的。如果你需要使用之前的状态,我想指出 setState 的第一个参数是 updater
,它可以带一个函数来从之前的状态计算下一个状态:
doFirst(array){
this.setState(previousState => ({ test: {...previousState.test, array} }));
}
doSecond(idx) {
this.setState(previousState => ({ test: {...previousState.test, idx} }));
}
我正在尝试 运行 上面的代码,但状态仅针对 idx 进行更新。据我了解,第二个函数的 setState 不会获得更新状态,这就是发生这种情况的原因。有没有办法让它正常工作(期待而不是将 2 个功能合并为一个)
doIt(idx,array) {
this.doFirst(array);
this.doSecond(idx);
}
doFirst(array){
//bla bla bla code
this.setState(test: {...this.state.test, array});
}
doSecond(idx) {
// bla bla bla code
this.setState(test: {...this.state.test, idx});
}
很难准确判断,因为您的示例 setState 调用不太正确,this.setState(test: {...this.state.test, idx});
。你是说你在做 this.setState({test: {...this.state.test, idx}});
?如果是这样,您应该使用回调而不是像这样的对象:
this.setState(() => ({ test: {...this.state.test, idx}})
下面两条语句同时执行。
this.doFirst(array);
this.doSecond(idx);
这两个调用 setState
.setState is asynchronous
。因此,无法保证值会按顺序更新。
由于这场比赛,价值被覆盖了。
更好地链接这些调用。
doIt(idx,array) {
this.doFirst(array);
}
doFirst(array){
//bla bla bla code
this.setState({test: {...this.state.test, array}},()=>{
this.doSecond(idx);
});
}
doSecond(idx) {
this.setState({test: {...this.state.test, idx}});
}
setState() 是异步的。
Think of setState() as a request rather than an immediate command to update the component. For better perceived performance, React may delay it, and then update several components in a single pass. React does not guarantee that the state changes are applied immediately.
它接受一个可选的回调函数,该函数将在 setState 完成并重新呈现组件后执行。你可以使用那个回调。
如果下一个状态依赖于前一个状态,建议使用updater函数形式setState(updater[ callback])
doIt(idx,array) {
this.doFirst(array, () => this.doSecond(idx));
}
doFirst(array, callback){
//bla bla bla code
this.setState(firstUpdaterFunction, callback);
}
doSecond(idx) {
// bla bla bla code
this.setState(2ndUpdaterFunction);
}
参考文献:
https://reactjs.org/docs/react-component.html#setstate
我假设您只是将括号放错了状态对象,所以我添加了这些。
无论如何,您想改用更新程序功能:
this.setState((prevState, props) => ({test: {...prevState.test, array}});
请注意,这可能不是您想要的,因为在 ES 2015 中它转换为:
this.setState((prevState, props) => ({test: {...prevState.test, array: array}});
您也想对其他功能做同样的事情。 React 批处理将状态调用设置在一起,因此如果您不使用更新程序,您可能会为连续的函数调用访问陈旧状态。这可能就是这种情况下发生的情况。
正如其他人已经指出的那样,setState
是异步的。如果你需要使用之前的状态,我想指出 setState 的第一个参数是 updater
,它可以带一个函数来从之前的状态计算下一个状态:
doFirst(array){
this.setState(previousState => ({ test: {...previousState.test, array} }));
}
doSecond(idx) {
this.setState(previousState => ({ test: {...previousState.test, idx} }));
}