--- 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 (
); }, 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 ( ); }, componentDidMount: function(rootNode) { var searchInput = this.refs.searchInput.getDOMNode(); searchInput.focus(); } }); ``` In this example, `this.refs.searchInput` will reference the `` component and is available in most lifecycle methods and event callbacks. We obtain a reference to the ``'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`.