hooks中通过useRef和useEffect获取上一轮的props和state
看一下官方文档对useRef的描述
useRef
当ref对象内容发生变化时,是不会引发组件重新渲染的;
再看一下useEffect的执行实际
他会在浏览器完成布局与绘制之后,在一个延迟时间中被调用.
结合useRef和useEffect,我们就能够获取到上一次的props和state;
function PrevState() {
const [count, setCount] = React.useState(0);
const prevCountRef = React.useRef();
React.useEffect(() => {
prevCountRef.current = count;
});
const handleClick = () => {
setCount(count+1)
}
return (
<>
<button onClick={handleClick}>+1</button>
<h1>Now: {count}, before: {prevCountRef.current}</h1>
</>
)
}
最初渲染过程:
count =0;
渲染页面: //Now: 0,before:
执行useEffect, prevCountRef.current=0;(因为ref对象内容变化不会引发组件重新渲染,所以prevCountRef.current的值变了, 页面依旧是: //Now: 0,before:)
当点击按钮 count +1 的时候,
出发handleClick函数,count +1;
count 发生变化, 组件重新渲染;
页面: //Now: 1,before: 0
触发useEffect,prevCountRef.current= 1
** ref对象发生变化,不会重新渲染;**
页面: //Now: 1,before: 0
以上;