gpt4 book ai didi

javascript - React Hooks useEffect 不会使用正确的状态

转载 作者:行者123 更新时间:2023-12-02 21:58:49 26 4
gpt4 key购买 nike

<Button
onClick={() => {
console.log('addedNodes', addedNodes)
let credentials = //something...
let nodes = [...addedNodes]
console.log(addedNodes)
setCurrentForm(
{
...currentForm,
credentials: credentials,
nodes: [...addedNodes],
}
)
}}
</Button>

我有一个按钮可以更新 currentForm使用另一个状态的状态addedNodes 。每当currentForm更新后,我 console.log currentForm使用useEffect .

useEffect(() => {
console.log('currentForm ,,,,,, ', currentForm)
console.log('addedNodes ,,,,,, ', addedNodes)
}, [currentForm]);

这会打印出正确的更新状态。

但是,当我尝试使用该状态添加 API 请求时,它会返回到更新之前的状态。

例如,当我更新我的 useEffect 时至

useEffect(() => {
console.log('currentForm,,,,,, ', currentForm)
console.log('addedNodes ,,,,,, ', addedNodes)
console.log('RUNNING POST')
setLoadingStatus('loading')

let body = {
form: currentForm,
}

intializeForms()
let options = {
headers: header,
method: 'post',
mode: 'cors',
body: JSON.stringify(body),
}
console.log('options.body', options.body)

const urls = ['...'];
const fetchJson = url => fetch(url, options).then(res => res.json());
Promise.all(urls.map(fetchJson))
.then(([result]) => {
...
})
.catch(err => {
setLoadingStatus('none')
console.log(err)
});

}, [currentForm]);

console.log('options.body', options.body)打印出旧的 currentForm .

这很奇怪,因为 console.log(currentForm)打印预期的状态,但当我实际使用它进行 API 调用时,它会返回到原始形式。

我认为这是因为这个useEffect每次状态更新时都会被调用,但不太确定。

请问有什么帮助吗?

最佳答案

有问题的代码片段

    let body = {
form: currentForm,
}
intializeForms()
// later bad body.form content

form 获取对 currentFrom 对象的引用,然后在 intializeForms() 中覆盖 currentFrom ... JSON.stringify(body) 对不良数据进行操作的方式。

为什么Kaca992的解决方案不起作用?

let body = {
form: {...currentForm},
}

它应该从 currentForm' 元素/属性创建一个新的对象。
可能它适用于 currentForm 的某些部分,例如对于节点,因为它们被正确地(以不可变的方式 - 通过新实例)分配/传递:

 nodes: [...addedNodes],

可能其他 currentForm 元素是始终相同的对象引用的副本,在更改时发生变化,而不是被新实例替换。

解决方案:

在这种情况下,在 currentForm“消耗”(stringify)之后调用 intializeForms() 就足够了 - let options = block 。

表单重置(intializeForms() 调用)的其他好地方可以是 Promise.all(... 解析函数 (.then部分)。

关于javascript - React Hooks useEffect 不会使用正确的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59938556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com