React Hooks和Component Lifecycle等效 [英] React Hooks and Component Lifecycle Equivalent
问题描述
componentDidMount
, componentDidUpdate
和 componentWillUnmount $的等价物是什么c $ c>生命周期钩子使用React钩子如
useEffect
?
What are the equivalents of the componentDidMount
, componentDidUpdate
, and componentWillUnmount
lifecycle hooks using React hooks like useEffect
?
推荐答案
componentDidMount
将一个空数组作为第二个参数传递给 useEffect()
仅在mount上运行回调。
componentDidMount
Pass an empty array as the second argument to useEffect()
to run only the callback on mount only.
function ComponentDidMount() {
const [count, setCount] = React.useState(0);
React.useEffect(() => {
console.log('componentDidMount');
}, []);
return (
<div>
<p>componentDidMount: {count} times</p>
<button
onClick={() => {
setCount(count + 1);
}}
>
Click Me
</button>
</div>
);
}
ReactDOM.render(
<div>
<ComponentDidMount />
</div>,
document.querySelector("#app")
);
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>
componentDidUpdate()<更新发生后立即调用/ code>。初始渲染不会调用此方法。
useEffect
在包括第一个渲染的每个渲染上运行。因此,如果你想要一个严格的等价物 componentDidUpdate
,你必须使用 useRef
来确定该组件是否已被安装一次。如果你想要更严格,使用 useLayoutEffect()
,但它会同步触发。在大多数情况下, useEffect()
应该足够了。
componentDidUpdate()
is invoked immediately after updating occurs. This method is not called for the initial render. useEffect
runs on every render including the first. So if you want to have a strict equivalent as componentDidUpdate
, you have to use useRef
to determine if the component has been mounted once. If you want to be even stricter, use useLayoutEffect()
, but it fires synchronously. In most cases, useEffect()
should be sufficient.
这个答案的灵感来自于Tholle ,所有功劳归于他。
This answer is inspired by Tholle, all credit goes to him.
function ComponentDidUpdate() {
const [count, setCount] = React.useState(0);
const isFirstUpdate = React.useRef(true);
React.useEffect(() => {
if (isFirstUpdate.current) {
isFirstUpdate.current = false;
return;
}
console.log('componentDidUpdate');
});
return (
<div>
<p>componentDidUpdate: {count} times</p>
<button
onClick={() => {
setCount(count + 1);
}}
>
Click Me
</button>
</div>
);
}
ReactDOM.render(
<ComponentDidUpdate />,
document.getElementById("app")
);
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>
在useEffect的回调参数中返回一个回调函数,它将在卸载之前调用。
Return a callback in useEffect's callback argument and it will be called before unmounting.
function ComponentWillUnmount() {
function ComponentWillUnmountInner(props) {
React.useEffect(() => {
return () => {
console.log('componentWillUnmount');
};
}, []);
return (
<div>
<p>componentWillUnmount</p>
</div>
);
}
const [count, setCount] = React.useState(0);
return (
<div>
{count % 2 === 0 ? (
<ComponentWillUnmountInner count={count} />
) : (
<p>No component</p>
)}
<button
onClick={() => {
setCount(count + 1);
}}
>
Click Me
</button>
</div>
);
}
ReactDOM.render(
<div>
<ComponentWillUnmount />
</div>,
document.querySelector("#app")
);
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>
这篇关于React Hooks和Component Lifecycle等效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!