- Key-Concept in React
- Encapsulates UI-Elements
- Stateful class-based components are available React > 0.13 (previously React.createClass)
- Stateless functional components are available React > 0.14
Use upper case names for components
- easy to use
- prefered for implementation
- return
nulldoesn't render DOM-Element - stateless
- no
this.state - no lifecycle
- no
this.refs
- no
import React from 'react';
export const Header = props => <h1>Hello World Header</h1>;
export function Footer() {
return <div>Hello World Footer</div>;
}- supports full features of React
- stateful
import React from 'react';
class Body extends React.Component {
render() {
return <h1>Hello World Body</h1>;
}
}
export default Body;import React from 'react';
import Body from './components/Body';
import { Header, Footer } from './components/Layout';
export default props => (
<div>
<Header />
<Body />
<Footer />
</div>
);- passing down to children via object-spread-operator
<div title={props.title} content={props.content}></div>
<div {...props}></div>class MyComponent extends React.Component {
static defaultProps = {
content: 'Hello World',
};
constructor(props) {
super(props);
}
}PropTypesto verify the "correctness" ofpropsat runtime- Verify optional, mandatory, type of component properties
import React from 'react';
MyComponent.propTypes = {
label: React.PropTypes.string.isRequired,
};- Key-Concept to rerender component (side-effect)
- Asynchron execution to "sometimes in the future"
- (currentState, object) -> newState -
setStatemerges (like Object.assign)
// set state with callback
this.setState((currentState, currentProps) => ({
counter: currentState + 1,
}));
//set state with object
this.setState({
content: 'Hello World',
});- Inital state via constructor
- Initial state via ES7 property initializer
class MyComponent extends React.Component {
// via property initializer
state = {
content: this.props.content || 'Hello World',
};
// via constructor
constructor(props) {
super(props);
this.state = {
content: props.content || 'Hello World',
};
}
}- constructor(props)
- componentWillMount()
- render()
- componentDidMount()
- componentWillUnmount()
- componentWillReceiveProps(nextProps)
- shouldComponentUpdate(nextProps, nextState)
- componentWillUpdate(nextProps, nextState)
- render()
- componentDidUpdate(prevProps, prevState)
- accessing native DOM-Elements
class MyComponent extends Recact.Component {
componentDidMount() {
// via `refs` reference (outdated)
this.refs.nameInputField.focus();
}
render() {
return (
<div>
<input type="text" ref="nameInputField" />
<input type="text" ref={node => node.focus()} />
</div>
);
}
}import React from 'react';
export default function Layout({ children }) {
return <div className="root-body">{children}</div>;
}
Layout.propTypes = {
children: React.PropTypes.element.isRequired,
};
