根据文件:
componentDidUpdate()在更新发生后立即调用。初始渲染时不调用此方法
我们可以使用新的useffect()钩子来模拟componentdiddupdate(),但是每次渲染后,甚至第一次渲染后都会运行useffect()。如何使其不在初始渲染时运行
正如您在下面的示例中所看到的,componentDidUpdateFunction在初始渲染期间打印,但在初始渲染期间未打印componentDidUpdateClass
函数组件didUpdateFunction(){
const[count,setCount]=React.useState(0);
React.useffect(()=>{
log(“componentDidUpdateFunction”);
});
返回(
<;div>;
<;p>;componentDidUpdateFunction:{count}次<;/p>;
<;按钮
onClick={()=>{
设置计数(计数+1);
}}
&燃气轮机;
点击我
<;/button>;
<;/div>;
);
}
类ComponentDidUpdateClass扩展了React.Component{
建造师(道具){
超级(道具);
此.state={
计数:0,
};
}
componentDidUpdate(){
log(“componentDidUpdateClass”);
}
render(){
返回(
<;div>;
<;p>;componentDidUpdateClass:{this.state.count}次<;/p>;
<;按钮
onClick={()=>{
this.setState({count:this.state.count+1});
}}
&燃气轮机;
点击我
<;/button>;
<;/div>;
);
}
}
ReactDOM.render(
<;div>;
<;ComponentDidUpdateFunction/>;
<;ComponentDidUpdateClass/>;
<;/div>;,
文档查询选择器(“app”)
);
<;脚本src=”https://unpkg.com/[email protected]/umd/react.development.js“></脚本>;
<;脚本src=”https://unpkg.com/[email protected]/umd/react dom.development.js“></脚本>;
<;div id=“应用程序”></部门>
我们可以使用useRef钩子来存储我们喜欢的任何可变值,因此我们可以使用它来跟踪useffect函数是否第一次运行
如果我们想让效果与componentdiddupdate在同一阶段运行,我们可以使用useLayoutEffect
示例
const{useState,useRef,useLayoutEffect}=React;
函数组件didUpdateFunction(){
const[count,setCount]=useState(0);
const firstUpdate=useRef(true);
使用布局效果(()=>{
if(firstUpdate.current){
firstUpdate.current=false;
回来
}
log(“componentDidUpdateFunction”);
});
返回(
<;div>;
<;p>;componentDidUpdateFunction:{count}次<;/p>;
<;按钮
onClick={()=>{
设置计数(计数+1);
}}
&燃气轮机;
点击我
<;/button>;
<;/div>;
);
}
ReactDOM.render(
<;ComponentDidUpdateFunction/>;,
document.getElementById(“应用程序”)
);
<;脚本src=”https://unpkg.com/[email protected]/umd/react.development.js“></脚本>;
<;脚本src=”https://unpkg.com/[email protected]/umd/react dom.development.js“></脚本>;
<;div id=“应用程序”></部门>