结论:
react18
import React, { useState, useEffect } from 'react';
// 最新的react 16
function Test() {
console.log('----render') // 默认执行2次
const [countA, setCountA] = useState(111);
const [countB, setCountB] = useState(222);
function onClick() {
// 一个种类,一个set执行2次render
// 二个种类,各一次set,那么执行2次render
// 二个种类及以上,执行2次render,还是执行2次
setCountA(countA + 1)
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
setTimeout(() => {
// 一个种类,一个set执行2次render
// 二个种类,各一次set,那么执行2次render
// 二个种类及以上,执行2次render,还是执行2次
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
});
}
useEffect(() => {
}, []);
return (
<div>
<p>{countA}-{countB}</p>
<button onClick={onClick}>点击我</button>
</div>
)
}
export default Test;
react16
import React, { useState, useEffect } from 'react';
// 最新的react 16
function Test() {
console.log('--render') // 默认执行1次
const [countA, setCountA] = useState(111);
const [countB, setCountB] = useState(222);
function onClick() {
// 一个种类,一个set执行1次render
// 二个种类,各一次set,那么执行1次render
// 二个种类及以上,执行2次render,还是执行1次
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountA(countA + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
// setCountB(countB + 1)
setTimeout(() => {
// 一个种类,一个set执行1次render
// 二个种类,各一次set,那么执行2次render
// 二个种类及以上n,执行2次render及以上,n*2
setCountA(countA + 1)
setCountA(countA + 1)
setCountA(countA + 1)
setCountA(countA + 1)
setCountB(countB + 1)
setCountB(countB + 1)
setCountB(countB + 1)
setCountB(countB + 1)
});
}
useEffect(() => {
}, []);
return (
<div>
<p>{countA}-{countB}</p>
<button onClick={onClick}>点击我</button>
</div>
)
}
export default Test;
react16, 18
import React, { useState } from 'react';
function App() {
const [number, setNumber] = useState(0);
function alertNumber() {
setTimeout(() => {
alert(number); // 操作步骤,先点击弹窗,然后快速+按钮,永远弹出的是0,16和18都这样子
}, 3000);
}
return (
<div className="App">
<p>{number}</p>
<button onClick={() => setNumber(number + 1)}>+</button>
<button onClick={alertNumber}>alertNumber</button>
</div>
);
}
export default App;
一下的以前的博客,不可靠
react刷新几次问题
react 16 setTimeout异步中的setA不可控制
const [a, setA] = useState(123);
console.log('----render');
return (
<div className="App">
<h1>{a}</h1>
<button onClick={() => {
// react 16 刷新两次, 结果仍然为124 react18刷新一次
setA(a+1);
setA(a+1);
}}>fffff</button>
</div>
);
----------------------------------------
const [number,setNumber] = useState(0);
function alertNumber(){
setTimeout(()=>{
alert(number); // 不论您点击多少次下边的click这里就是0
},3000);
}
return (
<>
<p>{number}</p>
<button onClick={()=>setNumber(number+1)}>+</button>
<button onClick={alertNumber}>alertNumber</button>
</>
)
----------------------------------------
export default function App() {
console.log('render----');
const [ca, setCa] = useState(1);
const aclick = () => {
setTimeout(() => {
// 会执行两次,但是最后的结果只会+1
setCa(ca + 1);
setCa(ca + 1);
});
}
return (
<div className="App" onClick={aclick}>
{ca}
</div>
);
}