79 lines
3.6 KiB
Markdown
79 lines
3.6 KiB
Markdown
---
|
||
title: Manage Updates with Lifecycle Methods
|
||
localeTitle: 使用生命周期方法管理更新
|
||
---
|
||
## 使用生命周期方法管理更新
|
||
|
||
这个挑战让您创建了几个生命周期函数,componentWillUpdate和ComponentWillReceiveProps。您将获得另一个名为componentDidUpdate的函数。我们将讨论如何在组件生命周期的每个阶段使用它们,以及在检查组件的不同阶段时应该如何使用它们。
|
||
|
||
让我们谈谈功能以及如何使用它们。组件生命周期可分为4个阶段。 Initlization - > Mounting - > Updating - > Unmounting。您将使用的组件将属于更新阶段。
|
||
|
||
调用这些函数的过程如下:componentWillReceiveProps - > componentWillUpdate - > componentDidUpdate
|
||
|
||
当您创建componentWillReceiveProps时,此函数将检查是否有新的道具被接收。如果组件确实接收到新的道具,那么将调用该函数,并且在块内可以比较两个道具状态。该函数将接受一个通常名为nextProps的参数,并将其与this.props进行比较。挑战是您使用传递的参数nextProps创建此函数。请参阅下面提供的功能
|
||
|
||
接下来将在组件生命周期componentWillUpdate中调用,此函数将检查是否有对props或state的任何更新,并将在组件呈现之前调用。挑战已经为您提供了这个功能,它会注销“组件即将更新”。
|
||
|
||
一旦组件通过componentWillUpdate阶段并且组件呈现,将调用componentDidUpdate。在此阶段,您可以调用this.setState来更新前两个阶段中发生的任何状态chanegs。注意:如果在条件内包装,则只能调用setState。由于这个挑战只是让你浮出水面,他们希望你注意“组件已更新”。
|
||
|
||
一旦实现了所有生命周期功能,您应该会看到一些控制台日志正在显示。首先,您将看到componentWillReceiveProps向您发送this.props和nextProps。接下来,您将看到一个控制台日志,通知您componentWillUpdate。最后,在组件呈现后,它将调用componentDidUpdate并注销“Component has updated”。
|
||
|
||
注意:您正在创建的组件已被弃用,并且可以在版本17之前使用。您可以在下面的资源部分中找到有关这些功能的更多信息。
|
||
|
||
```javascript
|
||
class Dialog extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
}
|
||
componentWillUpdate() {
|
||
console.log('Component is about to update...');
|
||
}
|
||
// change code below this line
|
||
|
||
// Create componentWillReceiveProps
|
||
// Pass in argument nextProps and log out the current prop and next prop
|
||
componentWillReceiveProps(nextProps) {
|
||
// Log the current property and the next property
|
||
console.log(this.props, nextProps)
|
||
}
|
||
|
||
// Create function componentDidUpdate
|
||
// Log out that the component has updated
|
||
componentDidUpdate() {
|
||
console.log("Component has updated")
|
||
}
|
||
|
||
// change code above this line
|
||
render() {
|
||
return <h1>{this.props.message}</h1>
|
||
}
|
||
};
|
||
|
||
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 (
|
||
<div>
|
||
<button onClick={this.changeMessage}>Update</button>
|
||
<Dialog message={this.state.message}/>
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
```
|
||
|
||
### 资源
|
||
|
||
* [反应组件生命周期](https://reactjs.org/docs/react-component.html#the-component-lifecycle)
|
||
* [React Component Lifecycle Visual](https://cdn-images-1.medium.com/max/2000/1*sn-ftowp0_VVRbeUAFECMA.png) |