资讯专栏INFORMATION COLUMN

React组件生命周期

anquan / 3454人阅读

摘要:组件的生命周期包含三个主要部分挂载组件被插入到中。更新组件被重新渲染,查明是否应该刷新。提供生命周期方法,你可以在这些方法中放入自己的代码。完整实例展示总结生命周期调用次数能否使用全局调用一次否否是否是是否否否否

组件的生命周期包含三个主要部分:

挂载: 组件被插入到DOM中。

更新: 组件被重新渲染,查明DOM是否应该刷新。

移除: 组件从DOM中移除。

</>复制代码

  1. React提供生命周期方法,你可以在这些方法中放入自己的代码。我们提供will方法,会在某些行为发生之前调用,和did方法,会在某些行为发生之后调用。

装载组件触发
getInitialState

object在组件被挂载之前调用。状态化的组件应该实现这个方法,返回初始的state数据。

初始化 this.state 的值,只在组件装载之前调用一次。

如果是使用 ES6 的语法,你也可以在构造函数中初始化状态,比如:

</>复制代码

  1. class Counter extends Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = { count: props.initialCount };
  5. }
  6. render() {
  7. // ...
  8. }
  9. }
getDefaultProps

只在组件创建时调用一次并缓存返回的对象(即在 React.createClass 之后就会调用)。

因为这个方法在实例初始化之前调用,所以在这个方法里面不能依赖 this 获取到这个组件的实例。
在组件装载之后,这个方法缓存的结果会用来保证访问 this.props 的属性时,当这个属性没有在父组件中传入(在这个组件的 JSX 属性里设置),也总是有值的。

如果是使用 ES6 语法,可以直接定义 defaultProps 这个类属性来替代,这样能更直观的知道 default props 是预先定义好的对象值:

</>复制代码

  1. Counter.defaultProps = { initialCount: 0 };
componentWillMount()

componentWillMount()只会在装载之前调用一次,在 render 之前调用,你可以在这个方法里面调用 setState 改变状态,并且不会导致额外调用一次 render

render()

组装生成这个组件的 HTML 结构(使用原生 HTML 标签或者子组件),也可以返回 null或者 false,这时候 ReactDOM.findDOMNode(this) 会返回 null

componentDidMount()

componentDidMount()在挂载结束之后马上被调用。只会在装载完成之后调用一次,在 render 之后调用,从这里开始可以通过 ReactDOM.findDOMNode(this) 获取到组件的 DOM 节点。

更新组件触发
componentWillReceiveProps(object nextProps)

当一个挂载的组件接收到新的props的时候被调用。该方法应该用于比较this.propsnextProps,然后使用this.setState()来改变state

在初始化渲染的时候,该方法不会调用。

</>复制代码

  1. componentWillReceiveProps: function(nextProps) {
  2. this.setState({
  3. likesIncreasing: nextProps.likeCount > this.props.likeCount
  4. });
  5. }
shouldComponentUpdate(object nextProps, object nextState): boolean

当组件做出是否要更新DOM的决定的时候被调用。

在接收到新的 props或者 state,将要渲染之前调用。该方法在初始化渲染的时候不会调用,在使用 forceUpdate 方法的时候也不会。

如果确定新的 propsstate 不会导致组件更新,则此处应该返回 false

</>复制代码

  1. shouldComponentUpdate: function(nextProps, nextState) {
  2. return nextProps.id !== this.props.id;
  3. }

如果 shouldComponentUpdate 返回 false,则 render() 将不会执行,直到下一次 state 改变。

componentWillUpdate(object nextProps, object nextState)

在更新发生之前被调用。你可以在这里调用this.setState()

componentDidUpdate(object prevProps, object prevState)

在更新发生之后调用。

卸载组件触发
componentWillUnmount()

在组件移除和销毁之前被调用。清理工作应该放在这里。比如无效的定时器,或者清除在 componentDidMount 中创建的 DOM 元素。

装载的方法
getDOMNode()

DOMElement可以在任何挂载的组件上面调用,用于获取一个指向它的渲染DOM节点的引用。

forceUpdate()

当你知道一些很深的组件state已经改变了的时候,可以在该组件上面调用,而不是使用this.setState()

</>复制代码

  1. 完整实例展示

</>复制代码

  1. var Button = React.createClass({
  2. getInitialState: function() {
  3. return {
  4. data:0
  5. };
  6. },
  7. setNewNumber: function() {
  8. this.setState({data: this.state.data + 1})
  9. },
  10. render: function () {
  11. return (
  12. );
  13. }
  14. })
  15. var Content = React.createClass({
  16. componentWillMount:function() {
  17. console.log("Component WILL MOUNT!")
  18. },
  19. componentDidMount:function() {
  20. console.log("Component DID MOUNT!")
  21. },
  22. componentWillReceiveProps:function(newProps) {
  23. console.log("Component WILL RECIEVE PROPS!")
  24. },
  25. shouldComponentUpdate:function(newProps, newState) {
  26. return true;
  27. },
  28. componentWillUpdate:function(nextProps, nextState) {
  29. console.log("Component WILL UPDATE!");
  30. },
  31. componentDidUpdate:function(prevProps, prevState) {
  32. console.log("Component DID UPDATE!")
  33. },
  34. componentWillUnmount:function() {
  35. console.log("Component WILL UNMOUNT!")
  36. },
  37. render: function () {
  38. return (
  39. {this.props.myNumber}

  40. );
  41. }
  42. });
  43. ReactDOM.render(
  44. ,
  45. document.getElementById("example")
  46. );
总结
生命周期 调用次数 能否使用setSate()
getDefaultProps 1(全局调用一次)
getInitialState 1
componentWillMount 1
render >=1
componentDidMount 1
componentWillReceiveProps >=0
shouldComponentUpdate >=0
componentWillUpdate >=0
componentDidUpdate >=0
componentWillUnmount 1

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80371.html

相关文章

  • 捋一捋React生命周期

    摘要:卸载阶段组件卸载和销毁老版生命周期之前的生命周期初始化阶段涉及个钩子函数这些方法会在组件初始化的时候被调用,只跟实例的创建有关。 前言:React 的版本从 v15 到 v16.3 ,再到v16.4,现在最新的版本是 v16.8了。其中最大的变化可能是React Hooks的加入,而最令人困惑的却是它的生命周期,新旧生命周期函数混杂在一起,难免会让许多新来者有很多困惑。所以这一篇我们来...

    MobService 评论0 收藏0
  • React.js 小书 Lesson20 - 更新阶段的组件生命周期

    摘要:所以对于组件更新阶段的组件生命周期,我们简单提及并且提供一些资料给大家。这里为了知识的完整,补充关于更新阶段的组件生命周期你可以通过这个方法控制组件是否重新渲染。大家对这更新阶段的生命周期比较感兴趣的话可以查看官网文档。 React.js 小书 Lesson20 - 更新阶段的组件生命周期 本文作者:胡子大哈本文原文:http://huziketang.com/books/react...

    Yumenokanata 评论0 收藏0
  • React组件生命周期

    摘要:组件生命周期此文章适合之前的版本,,添加了一些新的生命周期函数,同时准备废弃一些会造成困扰的生命周期函数。每个生命周期阶段调用的钩子函数会略有不同。 React组件生命周期 此文章适合 React@17 之前的版本,React@16.3.0,添加了一些新的生命周期函数,同时准备废弃一些会造成困扰的生命周期函数。所有如果在React@17 发布之前,这篇文章还是适用的。新的生命周期请看官...

    mgckid 评论0 收藏0
  • React组件生命周期详解

    摘要:组件生命周期构造方法是对类的默认方法,通过命令生成对象实例时自动调用该方法。该生命周期可以发起异步请求,并。后废弃该生命周期,可以在中完成设置渲染组件是一个组件必须定义的生命周期,用来渲染。该生命周期内可以进行。 React组件生命周期 constructor( ) 构造方法 constructor是ES6对类的默认方法,通过 new 命令生成对象实例时自动调用该方法。并且,该方法是...

    learn_shifeng 评论0 收藏0
  • React 深入系列4:组件生命周期

    摘要:因为是深入系列文章,本文不会仔细介绍每个生命周期方法的使用,而是会重点讲解在使用组件生命周期时,经常遇到的疑问和错误使用方式。父组件发生更新导致的组件更新,生命周期方法的调用情况同上所述。 文:徐超,《React进阶之路》作者授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念、特性和模式等,旨在帮助大家加深...

    warnerwu 评论0 收藏0
  • 不了解一下React16.3之后的新生命周期

    摘要:本文主要介绍之后的生命周期。该方法有两个参数和返回值为对象不需要返回整体,把需要改变的返回即可。必须有一个返回值,返回的数据类型可以有。此生命周期主要用于优化性能。最后,说明一点这三个生命周期在未来版本中会被废弃。 React16.3.0开始,生命周期进行了一些变化。本文主要介绍React16.3.0之后的生命周期。 React16.3.0之前生命周期: 16版本之前的react组件的...

    468122151 评论0 收藏0

发表评论

0条评论

anquan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<