【发布时间】:2020-01-27 20:36:40
【问题描述】:
<Button
onClick={() => {
console.log('addedNodes', addedNodes)
let credentials = //something...
let nodes = [...addedNodes]
console.log(addedNodes)
setCurrentForm(
{
...currentForm,
credentials: credentials,
nodes: [...addedNodes],
}
)
}}
</Button>
我有一个使用另一个状态 addedNodes 更新 currentForm 状态的按钮。
每当currentForm 更新时,我使用useEffect 控制台记录currentForm。
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,但不确定。
有什么帮助吗?
【问题讨论】:
-
useEffect回调将在每次currentForm值更改时运行,而不是在任何其他值更改时运行 -
@BillMetcalf 我要问的是,
useEffect得到了正确的currentForm,但没有将正确的东西传递给身体 -
注释掉
initializeForms()或移至.then -
@xadm
then如何在useEffect中工作?是不是类似于... [currentForm]).then( ... )? -
no ... 进入 Promise .then .... 但首先测试删除此调用
标签: javascript reactjs react-hooks