--- id: 5a24c314108439a4d403617f title: Manage Updates with Lifecycle Methods challengeType: 6 isRequired: false videoUrl: '' localeTitle: 使用生命周期方法管理更新 --- ## Description
另一个生命周期方法是componentWillReceiveProps() ,只要组件正在接收新的道具就会调用它。此方法接收新的props作为参数,通常写为nextProps 。您可以使用此参数并与this.props进行比较,并在组件更新之前执行操作。例如,您可以在处理更新之前在本地调用setState() 。另一种方法是componentDidUpdate() ,并在组件重新渲染后立即调用。请注意,渲染和安装在组件生命周期中被视为不同的东西。首次加载页面时,将挂载所有组件,这是调用componentWillMount()componentDidMount()位置。在此之后,随着状态的改变,组件会重新渲染自己。下一个挑战将更详细地介绍这一点。
## Instructions
子组件Dialog从其父组件Controller组件接收message道具。在Dialog组件中编写componentWillReceiveProps()方法,并将this.propsnextProps到控制台。您需要将nextProps作为参数传递给此方法,虽然可以将其命名为任何名称,但nextProps其命名为nextProps 。接下来,在Dialog组件中添加componentDidUpdate() ,并记录一条说明组件已更新的语句。此方法的工作方式类似于为您提供的componentWillUpdate() 。现在单击按钮更改消息并观察浏览器控制台。控制台语句的顺序显示调用方法的顺序。 注意:您需要将生命周期方法编写为普通函数而不是箭头函数来传递测试(将生命周期方法编写为箭头函数也没有优势)。
## Tests
```yml tests: - text: Controller组件应将Dialog组件呈现为子组件。 testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(Controller)); return mockedComponent.find("Controller").length === 1 && mockedComponent.find("Dialog").length === 1; })(), "The Controller component should render the Dialog component as a child.");' - text: Dialog组件中的componentWillReceiveProps方法应将this.props记录到控制台。 testString: 'assert((function() { const lifecycleChild = React.createElement(Dialog).type.prototype.componentWillReceiveProps.toString().replace(/ /g,""); return lifecycleChild.includes("console.log") && lifecycleChild.includes("this.props") })(), "The componentWillReceiveProps method in the Dialog component should log this.props to the console.");' - text: Dialog组件中的componentWillReceiveProps方法应将nextProps记录到控制台。 testString: 'assert((function() { const lifecycleChild = React.createElement(Dialog).type.prototype.componentWillReceiveProps.toString().replace(/ /g,""); const nextPropsAsParameterTest = /componentWillReceiveProps(| *?= *?)(\(|)nextProps(\)|)( *?=> *?{| *?{|{)/; const nextPropsInConsoleLogTest = /console\.log\(.*?nextProps\b.*?\)/; return ( lifecycleChild.includes("console.log") && nextPropsInConsoleLogTest.test(lifecycleChild) && nextPropsAsParameterTest.test(lifecycleChild) ); })(), "The componentWillReceiveProps method in the Dialog component should log nextProps to the console.");' - text: Dialog组件应调用componentDidUpdate方法并将消息记录到控制台。 testString: 'assert((function() { const lifecycleChild = React.createElement(Dialog).type.prototype.componentDidUpdate.toString().replace(/ /g,""); return lifecycleChild.length !== "undefined" && lifecycleChild.includes("console.log"); })(), "The Dialog component should call the componentDidUpdate method and log a message to the console.");' ```
## Challenge Seed
```jsx class Dialog extends React.Component { constructor(props) { super(props); } componentWillUpdate() { console.log('Component is about to update...'); } // change code below this line // change code above this line render() { return

{this.props.message}

} }; class Controller extends React.Component { constructor(props) { super(props); this.state = { message: 'First Message' }; this.changeMessage = this.changeMessage.bind(this); } changeMessage() { this.setState({ message: 'Second Message' }); } render() { return (
); } }; ```
### After Test
```js console.info('after the test'); ```
## Solution
```js // solution required ```