React生命周期总结

基本上所有React组件生命周期方法可以分为下面三个阶段

一、挂载(Mounting): 这个阶段发生在组件被创建并被插入到DOM时**

constructor(props)
在React组件被挂载之前,构造器constructor()首先被调用,由于继承了React.Component,我们必须在其他语句之前首先调用super(props);否则,在构造器中this.props的值为undefined,从而引发错误
componentWillMount()
在组件挂载之前,componentWillMount()方法将会被调用。componentWillMount()方法在render()方法之前被调用,所以在该方法中设置状态不会触发重新渲染。

render()
render()方法是必须的,并返回null、false 或者一个React Element。 当返回 null 或者 false 时,表示你不想渲染任何东西;并且ReactDOM.findDOMNode(this)将会返回null。 render()应该是纯粹的(pure),它不应该修改组件的状态,每次调用 都会返回相同的结果,它不直接与浏览器交互。如果我们想与浏览器进行交互,我们应该在componentDidMount()方法中完成相应的功能。

componentDidMount()
componentDidMount()将会在组件挂载之后被调用,在该方法中修改state将会触发重新渲染。可以在该方法中加载远程数据,然后根据新的数据重新渲染DOM。该方法不会在服务端被渲染过程中调用。该方法被调用时,已经渲染出真实的 DOM,可以再该方法中通过this.getDOMNode()访问到真实的 DOM(推荐使用 ReactDOM.findDOMNode())。

二、更新(Updating): 这个阶段发生在组件被重新渲染成虚拟DOM并决定实际DOM是否需要更新时**

componentWillReceiveProps(nextProps)
组件的props可以通过父辈组件来更改, componentWillReceiveProps()会在一个被挂载的组件接收到新属性的时候被调用,有的时候尽管没有属性发生改变,React 依然会调用componentWillReceiveProps(),所以如果我们只想处理属性改变的情况,我们需要对比 this.props 和 nextProps 。 在初始挂载的时候componentWillReceiveProps不会被调用,调用this.setState通常不会触发componentWillReceiveProps。

shouldComponentUpdate(nextProps, nextState)
默认情况下,在状态发生改变的时候,组件会重新渲染,在渲染之前,shouldComponentUpdate()将会被调用,默认返回true。在组件初始渲染或者调用forceUpdate()时,该方法不会被调用。 如果shouldComponentUpdate()返回false,那么componentWillUpdate()、render()、componentDidUpdate()将不会被调用,但是返回false不会影响子组件的重新渲染。
componentWillUpdate(nextProps, nextState)
在渲染之前,componentWillUpdate()将会被调用,组件第一次渲染之前不会调用该方法。 注意,我们不能在这里调用this.setState(),如果我们需要更新状态,我们应该在componentWillReceiveProps()中进行更新。

componentDidUpdate(prevProps, prevState)
更新完成之后,componentDidUpdate()会被立即调用,组件第一次渲染完成之后不会调用该方法。

三、卸载(Unmounting): 这个阶段发生在组件从DOM中被删除时**

componentWillUnmount()
在组件卸载之前,componentWillUnmount()方法会被调用

react生命周期顺序图解

这里写图片描述

生命周期总结

  • 首次实例化:getDefaultProps——>getInitialState——>componentWillMount——>render——>componentDidMount
  • 实例化完成后的更新:getInitialState——>componentWillMount——>render——>componentDidMount
  • 父组件改变,子组件生命周期:componentwillReceiveProps——>shouldComponentUpdate——>componentWillUpdate——>render——>omponentDidUpdate

父组件与子组件渲染

  1. 一个组件加载完毕后,如果既没有外部驱动,也没有内部驱动,是不会进行重新渲染的。

  2. 组件想要对自身进行刷新,可以通过调用setState()或者forceUpdate()来实现,这是让组件刷新的内部驱动

  3. 父组件通过给子组件传递props,告知子组件有可能重新渲染,子组件自己根据传来的数据(在componentWillReceiveProps方法中)决定是否有必要进行重新渲染。

    父组件可以通过props吧数据传递给子组件,但需要注意的是这个传递动作只发生render的过程中,在组件已经渲染完毕后,传递会停止。
    假如父组件内部定义了变量A ,并赋给了子组件某个属性,当A的值发生改变,并不足以让子组件刷新。只要A的变化不足以引发父组件调用自身render方法进行重新渲染,就不会传递。

组件的数据传递需要render驱动,而不是由数据变化驱动的。

在父组件中调用setState()或者forceUpdate()都可以引起组件对自身的重新渲染。这就完成了第一步,成功把props传给子组件。而子组件有全决定当接收到外部传来的属性的时候要怎么处理,具体实现在componentWillReceiveProps方法里,在组件首次渲染完毕之后,这个方法会在组件每次接收到外部传来的props的时候被调用。

  1. shouldComponentUpdate方法

    shouldComponentUpdate方法默认返回true,这就导致了每次更新都重新渲染。

    当React将要渲染组件时他会执行shouldComponentUpdate方法来看它是否返回true(组件应该更新,也就是重新渲染)。你只要重写shouldComponentUpdate方法让他根据情况返回true或者false来告诉React什么时候重新渲染。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue和React是两个常用的前端框架,它们都有自己的生命周期函数用于管理组件的创建、更新和销毁过程。 Vue的生命周期函数包括初始化、创建、挂载、更新和销毁等几个阶段。具体来说,Vue的生命周期函数按照顺序包括: 1. beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前调用。 2. created:在实例创建完成后调用,此时实例已经完成了数据观测 (data observer),属性和方法的运算,watch/event 事件回调。但是还未开始DOM编译。 3. beforeMount:在挂载开始之前被调用,此时尚未生成真实的DOM节点。 4. mounted:在挂载完成后被调用,此时组件已经生成了对应的真实DOM节点,可以对DOM进行操作。 5. beforeUpdate:在数据更新之前被调用,可以在这个钩子里进行更新前的操作。 6. updated:在数据更新完成后被调用,可以在这个钩子里进行更新后的操作。 7. beforeDestroy:在实例销毁之前调用,可以在这个钩子里进行一些清理工作。 8. destroyed:在实例销毁之后调用,此时实例中的所有指令及事件监听器都已经被移除。 React生命周期函数则有一些不同,主要包括: 1. constructor:在组件被创建时调用,用于初始化状态和绑定事件处理方法。 2. render:用于渲染组件的内容,返回一个React元素。 3. componentDidMount:在组件挂载到DOM后调用,可以进行一些需要DOM操作的初始化工作。 4. componentDidUpdate:在组件更新后被调用,可以进行一些需要DOM操作的更新工作。 5. componentWillUnmount:在组件即将从DOM中移除时调用,可以进行一些清理工作。 在新版本的React中,还引入了一些新的生命周期函数,比如getDerivedStateFromProps和getSnapshotBeforeUpdate,用于实现一些额外的功能。 总结一下,Vue和React生命周期函数在创建、更新和销毁的过程中有所不同,同时React还引入了一些新的生命周期函数。了解这些生命周期函数的执行顺序和用途可以帮助我们更好地管理和控制组件的行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值