| class 组件 | Hooks 组件 |
|---|
| constructor | useState |
| getDerivedStateFromProps | useState 里面 update 函数 |
| componentWillMount | useLayoutEffect |
| shouldComponentUpdate | useMemo |
| render | 函数本身 |
| componentDidMount | useEffect |
| componentDidUpdate | useEffect |
| componentWillUnmount | useEffect 里面返回的函数 |
| componentDidCatch | useEffect 无 |
| getDerivedStateFromError | useEffect 无 |
const [num, UpdateNum] = useState(0)
function ScrollView({row}) {
let [isScrollingDown, setIsScrollingDown] = useState(false);
let [prevRow, setPrevRow] = useState(null);
if (row !== prevRow) {
setIsScrollingDown(prevRow !== null && row > prevRow);
setPrevRow(row);
}
return `Scrolling down: ${isScrollingDown}`;
}
React 会立即退出第一次渲染并用更新后的 state 重新运行组件以避免耗费太多性能。
useLayoutEffect(() => {
console.log("useLayoutEffect:相当于componentWillMount");
return () => {
console.log("useLayoutEffect-返回函数", new Date());
};
}, [number]);
const Button = React.memo((props) => {
});
const getDoubleNum = useMemo(() => {
console.log("useMemo", "获取双倍的num");
return 2 * number;
}, [number]);
复制代码注意:React.memo 等效于 PureComponent,它只浅比较 props。这里也可以使用 useMemo 优化每一个节点。
render:这是函数组件体本身。
componentDidMount, componentDidUpdate: 。
useEffect(()=>{
}, [])
useEffect(() => {
document.title = `You clicked ${count} times`;
return () => {
}
}, [count]);
复制代码请记得 React 会等待浏览器完成画面渲染之后才会延迟调用 useEffect,因此会使得额外操作很方便
componentWillUnmount:相当于 useEffect 里面返回的 cleanup 函数
useEffect(()=>{
return function cleanup() {
}
}, [])
复制代码
componentDidCatch and getDerivedStateFromError:目前还没有这些方法的 Hook 等价写法,但很快会加上。
参考文章:juejin.cn/post/684490…