组件挂载或渲染完成后调用。useLayoutEffect使用方法、所传参数和useEffect完全相同。
他们的不同点在于,你可以把useLayoutEffect等同于componentDidMount、componentDidUpdate,因为他们调用阶段是相同的。而useEffect是在componentDidMount、componentDidUpdate调用之后才会触发的。
也就是说,当组件所有DOM都渲染完成后,同步调用useLayoutEffect,然后再调用useEffect。
useLayoutEffect永远要比useEffect先触发完成
在触发useLayoutEffect阶段时,页面全部DOM已经渲染完成,此时可以获取当前页面所有信息,包括页面显示布局等,你可以根据需求修改调整页面。
请注意,useLayoutEffect对页面的某些修改调整可能会触发组件重新渲染。如果是对DOM进行一些样式调整是不会触发重新渲染的,这点和useEffect是相同的。
在react官方文档中,明确表示只有在useEffect不能满足你组件需求的情况下,才应该考虑使用useLayoutEffect。 官方推荐优先使用useEffect。
其实呢,目前来看能够想到的场景都可以用useEffect来代替
import React, { useState, useEffect, useLayoutEffect } from 'react';
export default function hook() {
const [state, setState] = useState("hello world")
// 会出现闪烁
// useEffect(() => {
// let i = 0;
// while (i <= 1000000000) {
// i++;
// };
// setState("我是useEffect");
// }, []);
// 不会出现闪烁
useLayoutEffect(() => {
let i = 0;
while (i <= 100000000) {
i++;
};
setState("我是useLayoutEffect");
}, []);
return (
{state}
)
}