Commonly Used Lifecycle Methods (常见的生命周期方法)
render()
在使用ES6类(class)方式构建组件时,render
方法是唯一一个需要声明的方法。也可以使用函数方式构建组件,请参考。
当render()被调用时,它会检查this.props
和this.state
是否发生变化,并且return下面任意一种类型:
- React elements(react元素):通常是指通过
JSX
语法创建的元素。例如,DOM节点和
自定义的<SubComponet />
组件标签,都可以返回,供react进行渲染。
class SubComponent extends React.Component{
render() {
return (
<div>
<h2>子组件</h2>
</div>
)
}
}
class FatherComponent extends React.Component{
render() {
return <SubComponent />
}
}
export default FatherComponent;
- Arrays and fragments(数组和片段):通过数组或片段的包装返回多个元素。
在使用数组时,为了避免Warning: Each child in an array or iterator should have a unique "key" prop.
警告,需要为每个元素添加key
属性。
class ReturnArray extends PureComponent {
render (){
return [
<p key="1">React 16 can return multiple elements ❤️</p>,
<p key="2">React 16 can return multiple elements ❤️</p>,
<p key="3">React 16 can return multiple elements ❤️</p>,
];
};
}
React v16.2介绍了另一种返回多个元素的标签,即React.Fragment
。它只是通过JSX语法抽象出的空的标签,不支持标签属性。不需要额外的组件,不需要数据的形式,也不需要添加key值,总之就是把多元素作为其子节点。
class ReturnArray extends PureComponent {
render (){
return (
<React.Fragment>
<p>React 16 can return multiple elements ❤️</p>
<p>React 16 can return multiple elements ❤️</p>
<p>React 16 can return multiple elements ❤️</p>
</React.Fragment>
);
};
}
- Portals:请参考,待填坑。
- String and numbers:返回字符串或者数字,作为一个文本节点添加到DOM中去。
- Booleans or null:如果没有其他元素可返回的话,可以这样写:
return null; or
return false; or
return true; or
return undefined;
例子:输出数组中的奇数值,可以采用如下方法:
class App extends React.Component {
constructor(props){
super(props);
this.number = this.props.number;
}
render() {
if(this.number%2) {
return (
<div>
Number: {this.number}
</div>
)
}
return (null);
}
}
const data = [1, 2, 3, 4, 5]
ReactDOM.render(<div>{data.map(el => <App key={el} number={el} />)}</div>, document.getElementById('root'));
render()方法应该是一个纯函数,也就是输入和输出是固定的。此方法内不应该修改组件的状态,每次调用都应返回相同的结果,初次之外,也不应该直接的与浏览器进行交互。
如果你需要与浏览器进行交互,你可以在componentDidMount
或者其他生命函数里进行。保持render()是一个纯函数,将会很容易的构建组件。
注意:当
shouldComponentUpdate()
生命周期方法返回false
时,render()
方法将不再被调用。