Luk*_*kas 9 reactjs hydration next.js
是否可以在 Next.js 中强制使用SSR-only模式并且仅部分地对页面进行水合?假设我有这个应用程序:
组件/dynamic.jsx
export default () => (
<button onClick={() => console.log("I have been clicked")}>Click me</button>
)
Run Code Online (Sandbox Code Playgroud)
页面/index.jsx
import DynamicComponent from "../components/dynamic.jsx";
export default () => (
<div>
<h1>Hello World</h1>
<p>Lorem ipsum</p>
<Hydrate>
<DynamicComponent />
</Hydrate>
</div>
);
Run Code Online (Sandbox Code Playgroud)
现在假设我们正在渲染pages/index.jsx
,Next.js
因此它将在服务器上渲染并在客户端上完全水合。出于性能原因(缩小包大小,减少执行时间)并让应用程序更好地播放广告 () 我只想DynamicComponent
在客户端上水合,最多只为客户端加载 JavaScript DynamicComponent
。
这可能与
谢谢
你可以用一个黑客来做到这一点:
<>
<StaticContent>
<h1>Hello World</h1>
<p>Lorem ipsum</p>
</StaticContent>
<DynamicComponent />
</>
Run Code Online (Sandbox Code Playgroud)
和StaticContent
组件:
import { createElement, useRef, useState, useEffect } from 'react'
function useStaticContent() {
const ref = useRef(null)
const [render, setRender] = useState(typeof window === 'undefined')
useEffect(() => {
// check if the innerHTML is empty as client side navigation
// need to render the component without server-side backup
const isEmpty = ref.current.innerHTML === ''
if (isEmpty) {
setRender(true)
}
}, [])
return [render, ref]
}
export default function StaticContent({ children, element = 'div', ...props }) {
const [render, ref] = useStaticContent()
// if we're in the server or a spa navigation, just render it
if (render) {
return createElement(element, {
...props,
children,
})
}
// avoid re-render on the client
return createElement(element, {
...props,
ref,
suppressHydrationWarning: true,
dangerouslySetInnerHTML: { __html: '' },
})
}
``
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5176 次 |
最近记录: |