【发布时间】:2021-01-27 09:38:18
【问题描述】:
我遇到了与this question几乎相同的问题
代码有点太多了,所以我做了一个精简版的问题。 (如果我做错了,请原谅我)
基本上,我有一个主组件和一个子组件
主要组件
import React {useState} from 'react'
import SubComponent from './subcomponent';
const Main = (props) => {
const [state, setState] = useState(null);
const updateStateFunction = (data) => {
const newState = data
console.log(state)
setState(newState)
console.log(state)
}
return (
<div>
<SubComponent
updateStateFunction = {updateStateFunction}
/>
</div>
)
}
export default Main;
子组件
import React {useState} from 'react'
const SubComponent = ({updateStateFunction}) => {
return (
<div>
<button
onClick={() => updateStateFunction("Something new")}
>
</button>
</div>
)
}
export default SubComponent;
两个控制台日志都给出null。
我的解决方案尝试:
-
由于大多数堆栈溢出答案表明使用钩子的状态更新是异步的,我尝试使用
setTimeout -
我以为我们可以使用
async-await,但这是错误的方法 -
我尝试更新
useEffect中的状态,但关键是没有任何东西被重新渲染。这是因为正在更新的变量绝不是输出的一部分,而是对辅助变量进行排序以进行进一步的操作。 我这样做的方式是使用the solution in the above refereced question:
const Main = (props) => {
/*Debugging*/
let newState = null
useEffect(()=>{
console.log("useEffect called")
setState(newState)
}, [newState])
/*Debugging*/
const [state, setState] = useState(null);
const updateStateFunction = (data) => {
newState = data
console.log(state)
setState(newState)
console.log(state)
}
return (
<div>
<SubComponent
updateStateFunction = {updateStateFunction}
/>
</div>
)
}
我虽然因为 useEffect 钩子甚至没有被执行,所以我没有尝试the solution中的其他两种方法
我是否引用了错误类型的问题,或者这是反应中的常见行为?
很高兴在需要时提供更多信息
编辑:
-
我添加了
console.log(),因为我有操作,然后是使用状态变量值的状态更改。 -
使用 React 开发工具,我看到状态正在更新,而且几乎是即时更新的。问题是按钮按下会导致实际代码中的对话框弹出,其组件将该状态用于其他逻辑,因此我得到一个错误,即该状态仍然为空
【问题讨论】:
-
setState() 在 react 中执行是异步的,不保证会在下一行更新,慎用
-
这能回答你的问题吗? useState set method not reflecting change immediately @AshishKamble 实际上可以保证不会在与入队状态更新相同的渲染周期内被调用的任何函数中的任何行更新。
-
这是同一个问题。你的状态为空,第一次记录,你排队更新状态,然后再次记录当前状态,仍然为空。它回答了您的问题,因为反应状态更新是异步的,并且会在 渲染周期之间进行更新,因此您可以从不 记录刚刚入队的状态。这个问题几乎每天都会被问到。只需将状态更新排队并将新状态记录在依赖于该状态的 useEffect 中。
-
对,
useState更新函数不会返回 Promise,所以你不能等待它,setTimeout回调只会包含当前状态。 -
@AshishKamble 绝对保证下一行不会反映更新的状态。
state是来自闭包的const引用,无论setState()执行是否同步。
标签: javascript reactjs react-hooks react-functional-component