|
|
|
---
|
|
|
|
id: docs-advanced-components
|
|
|
|
title: Advanced Components
|
|
|
|
description: How to build advanced composite components.
|
|
|
|
layout: docs
|
|
|
|
prev: event-handling.html
|
|
|
|
next: mixins.html
|
|
|
|
---
|
|
|
|
|
|
|
|
Composite components extend a `ReactCompositeComponent` base class that provides
|
|
|
|
a very powerful API that makes React flexible and able to easily work with other
|
|
|
|
libraries and frameworks.
|
|
|
|
|
|
|
|
## Lifecycle Methods
|
|
|
|
|
|
|
|
Composite components can optionally implement lifecycle methods that are invoked
|
|
|
|
at various stages in the [component lifecycle](component-lifecycle.html) that
|
|
|
|
each have unique guarantees.
|
|
|
|
|
|
|
|
### Mounting
|
|
|
|
|
|
|
|
- `getInitialState(): object` is invoked before a component is mounted.
|
|
|
|
Stateful components should implement this and return the initial state data.
|
|
|
|
- `componentWillMount()` is invoked immediately before mounting occurs.
|
|
|
|
- `componentDidMount(DOMElement rootNode)` is invoked immediately after
|
|
|
|
mounting occurs. Initialization that requires DOM nodes should go here.
|
|
|
|
|
|
|
|
### Updating
|
|
|
|
|
|
|
|
- `componentWillReceiveProps(object nextProps)` is invoked when a mounted
|
|
|
|
component receives new props. This method should be used to compare
|
|
|
|
`this.props` and `nextProps` to perform state transitions using
|
|
|
|
`this.setState()`.
|
|
|
|
- `shouldComponentUpdate(object nextProps, object nextState): boolean` is
|
|
|
|
invoked when a component decides whether any changes warrant an update to the
|
|
|
|
DOM. Implement this as an optimization to compare `this.props` with
|
|
|
|
`nextProps` and `this.state` with `nextState` and return false if React
|
|
|
|
should skip updating.
|
|
|
|
- `componentWillUpdate(object nextProps, object nextState)` is invoked
|
|
|
|
immediately before updating occurs. You cannot call `this.setState()` here.
|
|
|
|
- `componentDidUpdate(object prevProps, object prevState, DOMElement rootNode)`
|
|
|
|
is invoked immediately after updating occurs.
|
|
|
|
|
|
|
|
### Unmounting
|
|
|
|
|
|
|
|
- `componentWillUnmount()` is invoked immediately before a component is
|
|
|
|
unmounted and destroyed. Cleanup should go here.
|
|
|
|
|
|
|
|
## Mounted Methods
|
|
|
|
|
|
|
|
_Mounted_ composite components also support the following methods:
|
|
|
|
|
|
|
|
- `getDOMNode(): DOMElement` can be invoked on any mounted component in order
|
|
|
|
to obtain a reference to its rendered DOM node.
|
|
|
|
- `forceUpdate()` can be invoked on any mounted component when you know that
|
|
|
|
some deeper aspect of the component's state has changed without using
|
|
|
|
`this.setState()`.
|
|
|
|
|
|
|
|
> Note:
|
|
|
|
>
|
|
|
|
> The `DOMElement rootNode` argument of `componentDidMount()` and
|
|
|
|
> `componentDidUpdate()` is a convenience. The same node can be obtained by
|
|
|
|
> calling `this.getDOMNode()`.
|
|
|
|
|
|
|
|
## Component Refs
|
|
|
|
|
|
|
|
A common use case of event callbacks or the lifecycle methods is to operate on a
|
|
|
|
component returned by `render()`. For example, consider a search component that
|
|
|
|
should auto-focus the input once mounted:
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
var SearchForm = React.createClass({
|
|
|
|
render: function() {
|
|
|
|
return (
|
|
|
|
<form action={this.props.action}>
|
|
|
|
<input type="search" placeholder="Search..." />
|
|
|
|
</form>
|
|
|
|
);
|
|
|
|
},
|
|
|
|
componentDidMount: function(rootNode) {
|
|
|
|
var searchInput = rootNode.firstChild;
|
|
|
|
searchInput.focus();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
Although this implementation works, it is fragile because `componentDidMount()`
|
|
|
|
now relies on `render()` returning a particular DOM structure.
|
|
|
|
|
|
|
|
React provides a better way for composite components to reference components
|
|
|
|
that it constructs in its `render()` method through the use of refs. A component
|
|
|
|
can assign a `ref` to any component it constructs. This will create a reference
|
|
|
|
to those components on `this.refs`. For example:
|
|
|
|
|
|
|
|
```javascript{5,10}
|
|
|
|
var SearchForm = React.createClass({
|
|
|
|
render: function() {
|
|
|
|
return (
|
|
|
|
<form action={this.props.action}>
|
|
|
|
<input type="search" placeholder="Search..." ref="searchInput" />
|
|
|
|
</form>
|
|
|
|
);
|
|
|
|
},
|
|
|
|
componentDidMount: function(rootNode) {
|
|
|
|
var searchInput = this.refs.searchInput.getDOMNode();
|
|
|
|
searchInput.focus();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
In this example, `this.refs.searchInput` will reference the `<input>` component
|
|
|
|
and is available in most lifecycle methods and event callbacks. We obtain a
|
|
|
|
reference to the `<input>`'s DOM node using `getDOMNode()`.
|
|
|
|
|
|
|
|
> Note:
|
|
|
|
>
|
|
|
|
> If you want to preserve compatibility with Google Closure Compiler's
|
|
|
|
> property crushing in `ADVANCED_OPTIMIZATIONS` mode, make sure to use string
|
|
|
|
> literals with `this.refs`.
|