【发布时间】:2016-12-20 04:16:02
【问题描述】:
componentWillReceiveProps 和其他生命周期方法似乎具有欺骗性的诱惑,给没有经验的 React 编码人员手中的代码带来不必要的复杂性和噪音。它们为什么存在?他们最典型的用例是什么?在不确定的时刻,我怎么知道答案是否在生命周期方法中?
【问题讨论】:
标签: javascript user-interface reactjs web
componentWillReceiveProps 和其他生命周期方法似乎具有欺骗性的诱惑,给没有经验的 React 编码人员手中的代码带来不必要的复杂性和噪音。它们为什么存在?他们最典型的用例是什么?在不确定的时刻,我怎么知道答案是否在生命周期方法中?
【问题讨论】:
标签: javascript user-interface reactjs web
我已经使用 react 几个月了,我的大部分工作都是从头开始创建一个大型应用程序。所以同样的问题一开始就出现了。
以下信息基于在开发过程中的学习以及查阅多个文档以使其正确。
正如问题中所问的,这里有几个反应生命周期方法的用例
componentWillMount()
componentDidMount()
state 初始化基于父母传递的道具。componentWillReceiveProps(nextProps,nextState)
shouldComponentUpdate(nextProps, nextState)
componentWillUpdate(nextProps,nextState)
this.setState() 在这个函数中是不允许的,它是在 componentWillReceiveProps 或 componentDidUpdate 中完成的componentDidUpdate(prevProps,prevState)
componentWillUnmount()
在不确定的时刻,我怎么知道答案是否在 生命周期方法?
我建议什么类比
更改是在组件本身中触发的
更改在组件外部触发
这里还有一些场景 -
state/props 的变化是否需要修改 DOM?
componentDidUpdate状态/道具的变化是否需要更新数据?
componentWillUpdate传递给孩子的道具发生了变化,孩子需要更新
shouldComponentUpdate添加事件监听器
componentDidMount调用api
来源 -
【讨论】:
最常用的生命周期方法的一些典型用例:
componentWillMount:在初始渲染之前调用。用于进行 AJAX 调用。例如,如果您需要获取用户信息来填充视图,这是一个很好的地方。如果您确实有 AJAX 调用,最好在 AJAX 调用完成之前呈现一个不确定的加载栏。我还使用 componentWillMount 调用 setInterval 并在页面呈现之前禁用 Chrome 的拖放功能。
componentDidMount:在组件渲染后立即调用。如果您需要访问 DOM 元素,这很有用。例如,我用它来禁用复制和粘贴到密码输入字段。如果您想知道组件的状态,非常适合调试。
componentWillReceiveProps:当组件接收到新的 props 时调用。用于在不重新渲染的情况下使用新道具设置状态。
【讨论】:
componentWillReceiveProps 是更新生命周期方法的一部分,在渲染开始之前被调用。最明显的例子是当新的道具被传递给组件时。例如,我们有一个 Form 组件和一个 Person 组件。表单组件有一个允许用户通过输入来更改名称的单一组件。输入绑定到 onChange 事件并设置表单上的状态。然后将状态值作为道具传递给 Person 组件。
import React from 'react';
import Person from './Person';
export default class Form extends React.Component {
constructor(props) {
super(props);
this.state = { name: '' } ;
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.setState({ name: event.currentTarget.value });
}
render() {
return (
<div>
<input type="text" onChange={ this.handleChange } />
<Person name={ this.state.name } />
</div>
);
}
}
只要用户在 this 中输入,就会开始对 Person 组件进行更新。在 Component 上调用的第一个方法是 componentWillReceiveProps(nextProps) 传入新的 prop 值。这允许我们将传入的 props 与我们当前的 props 进行比较,并根据值做出合乎逻辑的决策。我们可以通过调用 this.props 来获取我们当前的 props,新的值是传递给方法的 nextProps 参数。
【讨论】: