admin管理员组文章数量:1331890
I'm building a isomorphic application, but I'm using a third-party component that only renders on the client. So, particularly for this component, I need to only render it when I'm rendering in the client.
How do I detect if I'm at the client or at the server? I'm looking for something like isClient()
or isServer()
.
I'm building a isomorphic application, but I'm using a third-party component that only renders on the client. So, particularly for this component, I need to only render it when I'm rendering in the client.
How do I detect if I'm at the client or at the server? I'm looking for something like isClient()
or isServer()
.
9 Answers
Reset to default 54Internally, React uses a utility called ExecutionEnvironment
for this. It implements a few useful properties like canUseDOM
and canUseEventListeners
. The solution is essentially just what's suggested here though.
The implementation of canUseDOM
var canUseDOM = !!(
(typeof window !== 'undefined' &&
window.document && window.document.createElement)
);
I use this in my application like this
var ExecutionEnvironment = require('react/node_modules/fbjs/lib/ExecutionEnvironment');
...
render() {
<div>{ ExecutionEnvironment.canUseDOM ? this.renderMyComponent() : null }</div>
}
EDIT This is an undocumented feature that shouldn't be used directly. Its location will likely change from version to version. I shared this as a way of saying "this is the best you can do" by showing what the Facebook team uses internally. You may want to copy this code (it's tiny) into your own project, so you don't have to worry about keeping up with its location from version to version or potential breaking changes.
ANOTHER EDIT Someone created an npm package for this code. I suggest using that.
npm install exenv --save
You can use reacts lifecyle events (e.g.: componentDidMount
) to detect server/client side rendering.
Examples
As Hook
import { useState, useEffect } from 'react'
function useIsServer () {
const [isServer, setIsServer] = useState(true)
useEffect(() => {
setIsServer(false)
}, [])
return isServer
}
Usage
See below (Functional Component)
As Functional Component
import useIsServer from './above'
function ServerOnly ({ children = null, onClient = null }) {
const isServer = useIsServer()
return isServer
? children
: onClient
}
Usage
<ServerOnly
children='This String was rendered on the server'
onClient='This String was rendered on the client'
/>
As Class Component
class ServerOnly extends React.Component {
constructor (props) {
super(props)
this.state = {
isServer: true
}
}
componentDidMount() {
this.setState({
isServer: false
})
}
render () {
const { isServer } = this.state
const { children, onClient } = this.props
return isServer
? children
: onClient
}
}
Usage
<ServerOnly
children='This String was rendered on the server'
onClient='This String was rendered on the client'
/>
Two things that may be relevant:
Many projects use some convention where they set a global SERVER or CLIENT boolean so all your code can switch based off it. In your server bundle, set some global, like in this project
global.__SERVER__ = true;
And in your client bundle, set some global client to true, which you can achieve one way with Webpack's DefinePlugin
new webpack.DefinePlugin({
__CLIENT__: true
})
With the above approach, you could switch based off that variable in willMount, or render, to do one thing on the server, and another on the client.
The second thing that may be helpful here is componentDidMount
only runs on the client, but not on the server.
You can also use componentDidMount()
, as this lifecycle method is not run when the page is server-side rendered.
You could also just use the use-ssr
React hook
import useSSR from 'use-ssr'
const App = () => {
var { isBrowser, isServer } = useSSR()
// Want array destructuring? You can do that too!
var [isBrowser, isServer] = useSSR()
/*
* In your browser's chrome devtools console you should see
* > IS BROWSER:
本文标签:
版权声明:本文标题:javascript - In React, how do I detect if my component is rendering from the client or the server? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人,
转载请联系作者并注明出处:http://www.betaflare.com/web/1737009945a1959415.html,
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
window
, orprocess
? – elclanrs Commented Aug 26, 2015 at 1:04if(windows) {}
while I should actually dotypeof window
. – Andre Pena Commented Aug 26, 2015 at 1:12ReactDOM.render( <Component />, document.getElementById('root') , () => console.log('render!))
– Tony Jin Commented Feb 23, 2018 at 6:41