按钮点击第一次不会更新this.setState;第二次点击才会更新。
按钮点击第一次不会更新this.setState;第二次点击才会更新。
我正在尝试在React中构建我的第一个计算器。
我的按钮似乎出了问题(我认为是这个原因)。
在使用console.log
进行测试时,我发现第一次点击加法按钮时,并未更新所有的setStates。相反,第二次点击才能正确更新。
有任何想法为什么它不起作用吗?
我有一个名为"DaInserting"的div,当用户点击任何数字键时,它会被更新,然后当用户点击加法/减法等按钮时,v1
应该被更新,但它没有。它在第二次点击时才会更新-请查看console.log
。
在用户点击加法/减法后,"DaInserting"被重置,然后用户再次点击一些数字,然后点击结果按钮,这时它应该检查用户选择的是什么(加法/减法)。
在React中,setState
是异步的(参见这些文档),因此不能在调用setState
之后立即依赖于状态的更新。相反,通常需要等到下一次渲染时才能更新状态值。
为了解决这个问题,可以通过将回调函数(作为第二个参数)传递给setState
,或者使用await
,或者直接使用正在更新状态的新值。在这里,我建议使用最后一种选项。另外,通常最好在退出函数之前调用setState
,以避免异步混乱。
这是一个更新deAnswer
方法的示例:
deAnswer = () => { let answer = 0; if (this.state.isCal === "add") { answer = this.state.v1 + this.state.xxxxx; console.log("and the answer is :" + answer); } this.setState({ v2: this.state.v1, answer: answer, }) } render() { return ( <div className="row"> <div id="DaInserting">{ this.state.answer }</div> </div> ) }
还要注意,我已经删除了设置innerHTML
的部分,因为你应该通过使用状态变量进行渲染而不是直接操作DOM来更改"DaInserting"
div的内容。
此外,考虑查看React入门教程,它是一个很好的阅读材料,可以帮助你学习和构建React应用。
谢谢您。我对一件事情感到困惑,使用innerHTML有什么害处?
使用innerHTML
存在可能受到XSS攻击的风险,尽管在这里这并不是一个问题。主要的问题是它不是最佳实践,而使用state
和render
来修改显示内容是最好的做法。在更复杂的示例中,使用innerHTML
可能会变得繁琐,并且会使代码更难阅读。
当点击按钮时,this.setState没有在第一次点击时更新;而是在第二次点击时更新。这个问题出现的原因是,setState是一个异步函数。解决方法是将函数作为回调函数传递给setState,以便在状态更新后执行。具体做法如下:
this.setState({ v1:firstNum, xxxxx:0, isCal:"add"}, () => { console.log("Add, firstNum is " + firstNum ); console.log("and v1 is: " + this.state.v1); console.log("and isCal is: " + this.state.isCal); console.log(news) });
通过将回调函数作为参数传递给setState,可以确保在状态更新完成后执行相应的操作,从而解决这个问题。