在 React 项目使用服务端渲染,如果使用了 useLayoutEffect
时,会有警告:
⚠️ Warning: useLayoutEffect does nothing on the server, because its effect cannot be encoded into the server renderer's output format. This will lead to a mismatch between the initial, non-hydrated UI and the intended UI. To avoid this, useLayoutEffect should only be used in components that render exclusively on the client. See https://fb.me/react-uselayouteffect-ssr for common fixes.
解决方法
使用 useEffect 替代
如果副作用对首次渲染不重要,那么可以直接使用 useEffect
。useEffect
和 useLayoutEffect
如何选择,可以查看React 的 useEffect 和 useLayoutEffect 的区别。
MyComponent() { useEffect(() => { // ... });}
与 useLayoutEffect
一样,它不会在服务器上运行,但也不会发出警告。
使用 useLayoutEffect 延迟显示组件
如果在首次渲染时使用 useEffect
发现 UI 出现了问题,必须要切换到 useLayoutEffect
正常。那么可以推迟组件的显示,直到客户端的 JavaScript 完成加载并激活了该组件。在服务器渲染的 HTML 中不包含那些需要布局效果的子组件。
function Parent() { const [showChild, setShowChild] = useState(false); useEffect(() => { // 组件在客户端挂载后,再显示需要用到 useLayoutEffect 的组件。 setShowChild(true); }, []); if (!showChild) { return null; } return <Child {...props} />;}function Child(props) { useLayoutEffect(() => { // 执行 useLayoutEffect 逻辑 });}