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)
|