【发布时间】:2021-05-21 23:40:08
【问题描述】:
我为两个不同的 redux 变量使用了两个 useEffect。当我在浏览器中运行应用程序时一切正常,但它没有通过开玩笑测试,因为状态没有更新。以下是代码:
import { useState, useEffect } from 'react';
const [testString, setTestString] = useState('test');
useEffect(() => {
setTestString('changed');
}, [testA]);
useEffect(() => {
console.log(testString);
}, [testB]);
我在开玩笑时通过了 testA 和 testB 并且这些效果以正确的顺序运行。但是当它在第二个 useEffect 中打印时 testString 没有更新,它仍然将值显示为“测试”。知道我在哪里出错了吗?
【问题讨论】:
-
"test" 是第一次渲染的正确值。你是说它不会用新值再次渲染?
-
即使是第一次渲染也不应该打印更改的值,因为当它到达 testA useEffect 时,它更新了值,是的,即使是第二次渲染,它也没有更新值,我也很困惑如何它可以在浏览器中运行,但不能在开玩笑测试中运行?
-
这是由于 setTestString 将异步设置状态以及 react 如何运行 useEffects 造成的。它将运行,找到并运行第一个 useEffect,然后在更新值之前在同一渲染通道中找到并运行第二个 useEffect。
-
@JacobSmit 我很好奇当应用程序在浏览器中运行时它是如何工作的。那么开玩笑的方法是什么?