What React Stateless Components are Missing
Stateless React components got a new syntax in React 0.14. It's much simpler. It's just a function call. Besides it just looking simpler, there are some major differences in what is available in a stateless component written this way. There are some things missing -- purposefully not included -- that you may be used to. Let's look at a few things.
Stateless components are now specifically not just components where you don't use this.state
. They're componets that are written in the form of a function:
function Chips(props) {
return <div>In the secret {props.place}</div>
}
The observations made in this article will not apply to components that are created using the class Chips extends React.Component
or React.createClass
syntax, whether they use state or not.
No Backing Instance
A React component's backing instance is the object in memory that represents the node in the view. This backing instance is the place where state is usually stored (using React's this.state
). Well now there's no this
in stateless components. Thus, there's not going to be a place for this.state
. Stateless, remember? Data just passes through the pure function and into the resulting view.
No Lifecycle Methods
Because there's no backing instance as a place to put hooks for your code in the component lifecycle, you can not use any of the lifecycle methods from React.Component
. Methods such as componentDidMount
and componentWillReceiveProps
are out. And since the stateless component is a pure function that just reproduces its view state on props
change, why would you need lifecycle methods anyway?
No Reference to the Component
Often when testing, it's useful to get a reference to the component itself. In the case of stateless components, they're just fired and forgotten, rendered into the view without the ability to get a handle on them. They're just UI at this point, just in the DOM. You can go to the DOM to do your testing.
Depending on your test environment setup, you may want to wrap your stateless components in a class
-based component you can get a reference to.
Note that for stateless components, ReactDOM.render
and TestUtils.renderIntoDocument
will return null
.
No refs
Stateless components can't be the target of a ref
. There's no backing instance. You can't have refs
internally to children either. Remember, this
and this.refs
aren't around. If your stateless component has a child that is a class
-based component, it may have refs
. The docs are another good reference on refs
.
Updated: Null Returns
As of react@15.0.0, now stateless component functions can return null.
~~A class
-based component may return null
as its value in the view. But a stateless component may not. To get around this, return
This will be fully invisible in the view.
So what else have you found that is unavailable in stateless functions?