React中的组件生命周期函数
类组件可以定义将在组件生命周期的特定时间点执行的函数。 使用它们可以更好地控制组件。 以下是 React 中可用生命周期函数的概述。
以下示例是非常糟糕的 React,仅用于演示目的。
组件WillMount
componentWillMount
在组件第一次渲染之前被调用。 您可以使用它在初始渲染之前调用 setState
。
class Scorecard extends Component { componentWillMount() { this.setState({score: 0}); } render() { const {playerName} = this.props; // `this.state` defaults to null, but since it'll be set in // `componentWillMount`, it can safely be destructured. const {score} = this.state; const message = `Current Score: ${score}`; return ( <div> <h1>{playerName}</h1> <div>{message}</div> </div> ); } }
调用 setState
通常会触发重新渲染,但在 componentWillMount
中调用它不会(因为它一开始没有渲染)。
组件DidMount
componentDidMount
在组件第一次渲染后调用。 这可用于在组件出现后立即启动异步操作。
class Scorecard extends Component { // Other functions omitted for brevity. componentDidMount() { // You'd probably want to send an AJAX call or something, // but let's say they get 1000 points after the first second. setTimeout(() => this.setState({score: 1000}), 1000); } }
componentDidMount
在服务器渲染中不会被调用。
组件WillReceiveProps
componentWillReceiveProps
在组件接收到新的 props 时被调用,但在它渲染之前。 您可以在此处调用 setState
而不会导致另一次重新渲染,因为已经有一个待处理。
class Scorecard extends Component { // Other functions omitted for brevity. componentWillReceiveProps(nextProps) { // `nextProps` is the new props, while `this.props` are the old ones. const {playerName} = this.props; // It is entirely possible that the new `playerName` is the same as the old one. if (nextProps.playerName !== playerName) { // Changing your name resets the score to zero. this.setState({score: 0}); } } }
应该组件更新
shouldComponentUpdate
在 props 或 state 改变之后(以及 componentWillReceiveProps
之后)被调用,但在它渲染之前。 它在生命周期函数中是独一无二的,因为它预计会返回一个布尔值。 如果为 false,则不会调用 render
。 这对于跳过不必要的渲染并节省一些 CPU 非常有用。
class Scorecard extends Component { // Other functions omitted for brevity. shouldComponentUpdate(nextProps, nextState) { // Same as `componentWillReceiveProps`, `nextProps` is the // new props and `this.props` is the old. const {playerName} = this.props; // Ditto for `nextState` and `this.state`. const {score} = this.state; // Only `playerName` and `score` affect the display. // If something else changes, re-rendering would be a waste. return !(nextProps.playerName === playerName && nextState.score === score); } }
组件WillUpdate
componentWillUpdate
在组件渲染之前和 shouldComponentUpdate
之后被调用。 它不能调用setState
。
class Scorecard extends Component { // Other functions omitted for brevity. componentWillUpdate(nextProps, nextState) { const {playerName} = this.props; // If `playerName` changes, log a message. if (nextProps.playerName !== playerName) { // Note that even though `componentWillReceiveProps` called `setState`, `this.state` is still the original value. const {score} = this.state; console.log(`${playerName} is now ${nextProps.playerName}. His score of ${score} is forfeit.`); } } }
组件DidUpdate
componentDidUpdate
在 render
完成后被调用。 与其他更新函数一样,它将同时具有新旧版本的 props 和 state,但使用以前的版本作为参数。
class Scorecard extends Component { // Other functions omitted for brevity. componentDidUpdate(prevProps, prevState) { const {playerName} = this.props; // You guessed it, `prevProps` are the props as they used to be and `this.props` are what they are now. // Ditto for `prevState` and `this.state`. if (prevProps.playerName !== playerName) { const {score} = prevState; console.log(`${playerName} used to be ${prevProps.playerName}. His former score was ${score}.`); } } }
组件WillUnmount
最后,在移除组件之前调用 componentWillUnmount
。 用它来告别。
class Scorecard extends Component { // Other functions omitted for brevity. componentWillUnmount() { console.log('Sayonara!'); } }