使React useEffect挂钩在初始渲染时不运行

根据文件:

componentDidUpdate()在更新发生后立即调用。初始渲染时不调用此方法

我们可以使用新的useffect()钩子来模拟componentdiddupdate(),但是每次渲染后,甚至第一次渲染后都会运行useffect()。如何使其不在初始渲染时运行

正如您在下面的示例中所看到的,componentDidUpdateFunction在初始渲染期间打印,但在初始渲染期间未打印componentDidUpdateClass

函数组件didUpdateFunction(){
const[count,setCount]=React.useState(0);
React.useffect(()=&gt{
log(“componentDidUpdateFunction”);
});
返回(
<div>
<p>componentDidUpdateFunction:{count}次</p>
<按钮
onClick={()=&gt{
设置计数(计数+1);
}}
&燃气轮机;
点击我
</button>
</div>
);
}
类ComponentDidUpdateClass扩展了React.Component{
建造师(道具){
超级(道具);
此.state={
计数:0,
};
}
componentDidUpdate(){
log(“componentDidUpdateClass”);
}
render(){
返回(
<div>
<p>componentDidUpdateClass:{this.state.count}次</p>
<按钮
onClick={()=&gt{
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“&gt&lt/脚本>
<脚本src=”https://unpkg.com/[email protected]/umd/react dom.development.js“&gt&lt/脚本>
<div id=“应用程序”&gt&lt/部门&gt

我们可以使用useRef钩子来存储我们喜欢的任何可变值,因此我们可以使用它来跟踪useffect函数是否第一次运行

如果我们想让效果与componentdiddupdate在同一阶段运行,我们可以使用useLayoutEffect

示例

const{useState,useRef,useLayoutEffect}=React;
函数组件didUpdateFunction(){
const[count,setCount]=useState(0);
const firstUpdate=useRef(true);
使用布局效果(()=&gt{
if(firstUpdate.current){
firstUpdate.current=false;
回来
}
log(“componentDidUpdateFunction”);
});
返回(
<div>
<p>componentDidUpdateFunction:{count}次</p>
<按钮
onClick={()=&gt{
设置计数(计数+1);
}}
&燃气轮机;
点击我
</button>
</div>
);
}
ReactDOM.render(
<ComponentDidUpdateFunction/>,
document.getElementById(“应用程序”)
);
<脚本src=”https://unpkg.com/[email protected]/umd/react.development.js“&gt&lt/脚本>
<脚本src=”https://unpkg.com/[email protected]/umd/react dom.development.js“&gt&lt/脚本>
<div id=“应用程序”&gt&lt/部门&gt

发表评论