2019-09-05
描述
一个可以检查代码代码运行在浏览器端还是服务端的 hook。
- 创建一个可以返回适当对象的自定义 hook,
- 使用
typeof window
,window.document
和window.document.createElement
来检查代码是否运行在浏览器中 - 使用
React.useState()
hook 定义inBrowser
状态变量 - 使用
React.useEffect()
hook 来更新inBrowser
的状态变量及最终的清除 - 使用
React.useMemo()
记住自定义 hook 返回的值
实现
const isDOMavailable = !!( typeof window !== 'undefined' && window.document && window.document.createElement ); const useSSR = (callback, delay) => { const [inBrowser, setInBrowser] = React.useState(isDOMavailable); React.useEffect(() => { setInBrowser(isDOMavailable); return () => { setInBrowser(false); } }, []); const useSSRObject = React.useMemo(() => ({ isBrowser: inBrowser, isServer: !inBrowser, canUseWorkers: typeof Worker !== 'undefined', canUseEventListeners: inBrowser && !!window.addEventListener, canUseViewport: inBrowser && !!window.screen }), [inBrowser]); return React.useMemo(() => Object.assign(Object.values(useSSRObject), useSSRObject), [inBrowser]); };
使用
const SSRChecker = props => { let { isBrowser, isServer } = useSSR(); return <p>{ isBrowser ? 'Running on browser' : 'Running on server' }</p>; }; ReactDOM.render(<SSRChecker />, document.getElementById('root'));
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于