【发布时间】:2020-09-25 15:29:53
【问题描述】:
我在我的 React 应用程序中遇到了一些奇怪的行为,其中带有状态(比如 state1)作为第二个参数的 setEffect 正在更改另一个变量(不是状态)而没有调用 setState1。所以我编写了以下代码,看看是否会发生同样的情况,它确实发生了:
import React, { useState, useEffect } from 'react';
function App() {
let [state1, setState1] = useState('');
let count = 0;
useEffect(() => {
count = count + 1000;
console.log('USEEFFECT_count: ' + count);
}, [state1]);
setInterval(() => {
console.log('SETINTERVAL_count: ' + count);
}, 1000);
return (
<div className="App">
</div>
);
}
export default App;
基本上,只有在调用 setState1 来更改 state1 的值时,变量 count 才应该收到 1000 的值。但是控制台的返回是
SETINTERVAL_count: 1000
SETINTERVAL_count: 0
SETINTERVAL_count: 1000
SETINTERVAL_count: 0
SETINTERVAL_count: 1000
SETINTERVAL_count: 0
SETINTERVAL_count: 1000
SETINTERVAL_count: 0
SETINTERVAL_count: 1000
SETINTERVAL_count: 0
正如预期的那样,useEffect 中的 console.log 永远不会被调用。但如果是这样的话,那么:
- 他为什么要把 1000 相加?
- 为什么这个值会重置为 0?
如果我添加一个 state2 和另一个总和为 5000 的 useEffect ,它会从第一个 useEffect 增加到 1000:
import React, { useState, useEffect } from 'react';
function App() {
let [state1, setState1] = useState('');
let [state2, setState2] = useState('');
let count = 0;
useEffect(() => {
count = count + 1000;
console.log('USEEFFECT1_count: ' + count);
}, [state1]);
useEffect(() => {
count = count + 5000;
console.log('USEEFFECT2_count: ' + count);
}, [state2]);
setInterval(() => {
console.log('SETINTERVAL_count: ' + count);
}, 1000);
return (
<div className="App">
</div>
);
}
export default App;
console.log 的结果:
SETINTERVAL_count: 6000
SETINTERVAL_count: 0
SETINTERVAL_count: 6000
SETINTERVAL_count: 0
SETINTERVAL_count: 6000
SETINTERVAL_count: 0
SETINTERVAL_count: 6000
SETINTERVAL_count: 0
【问题讨论】:
标签: reactjs