Vue与React的异同—生命周期(一)

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/79016621

React与Vue都有lifecycle生命周期的概念,表示每个组件实例在被创建之前都要经过一系列的初始化过程。比如设置数据监听、编译模板、挂载实例到视图、在数据变化时更新视图等。

Vue生命周期

所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算。这意味着 你不能使用箭头函数来定义一个生命周期方法 (例如 created: () => this.fetchTodos())。这是因为箭头函数绑定了父上下文,因此 this 与你期待的 Vue 实例不同,this.fetchTodos 的行为未定义。

主要有created、mounted、updated、destroyed,以及各自的before钩子。相比React多了个特殊的activated和deactivated,该钩子只在keep-alive 组件才起作用。

具体生命周期图示参考Vue文档

demo如下:

    new Vue({
        name: 'demo',
        el: '#demo',
        beforeCreate() {
          //在实例初始化之后,数据观测 (data observer) 
          //和 event/watcher 事件配置之前被调用。 
        },
        created() {
          //在实例创建完成后被立即调用。在这一步,
          //实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,
          //watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
        },
        beforeMoute(){
          //在挂载开始之前被调用:相关的 render 函数首次被调用。
        },
        mounted() {
          //el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。
          //如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。
          /*
          *mounted 不会承诺所有的子组件也都一起被挂载。
          *如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick
          */
          this.$nextTick(function () {
            // Code that will run only after the
            // entire view has been rendered
          })
        },
        beforeUpdate() {
          //数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
        },
        updated() {
          //数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
          /*
          *同样updated不会承诺所有的子组件也都一起被挂载。
          *如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick
          */
        },
        beforeDestroy() {
          //实例销毁之前调用。在这一步,实例仍然完全可用。
        },
        destroyed() {
          //Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,
          //所有的事件监听器会被移除,
          //所有的子实例也会被销毁。
        }
    });

React生命周期

在组件的整个生命周期中,随着组件的props或者state发生改变,其视图表现也会有相应的变化。一个组件就是一个状态机,对于特定地输入,它总返回一致的输出

一个React组件的生命周期分为三个部分:挂载期(Mounting)、存在更新期(Updating)和销毁时(Unmounting)。

Mounting

当一个组件实例被创建并且插入到DOM中,以下钩子将被调用
- constructor()
继承react的props,和设置state的初始化

constructor(props) {
  super(props); //不能缺少
  this.state = {
    color: props.initialColor
  };
}
  • componentWillMount()

    类似Vue的beforeMoute。


只mount前调用一次,在 render 之前调用,你可以在这个方法里面调用 setState 改变状态,并且不会导致额外调用一次 render,但是一般不建议这么做,在constructor中初始话state。
- render()
类似Vue的template 该方法会创建一个虚拟DOM,用来表示组件的输出。对于一个组件来讲,render方法是唯一一个必需的方法。render方法需要满足下面几点: 1.只能通过 this.props 和 this.state 访问数据(不能修改) 2.可以返回 null,false 或者任何React组件 3.只能出现一个顶级组件,不能返回一组并列元素(**react16也支持返回数组了**) 4.不能改变组件的状态 5.不能修改DOM的输出 - componentDidMount()

类似Vue的mounted

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

Updating

通过改变props或state来驱动视图的更改,会触发以下钩子

  • componentWillReceiveProps()
  • shouldComponentUpdate()
    在react中这是一个性能优化的关键点,当父组件改变,全部子组件都会重新渲染,可以通过该钩子返回false来阻止渲染,此处还有另外一个方法pureComponent,详细参考React官方文档,而在Vue中,默认是做了此优化,详见Vue文档
shouldComponentUpdate(nextProps, nextState){
    //return boolean
}


  • componentWillUpdate()

类似Vue的beforeUpdate、

  • render()

  • componentDidUpdate()
    类似Vue的updated
  • Unmounting


    • componentWillUnmount()

    类似Vue的beforeDestroy
    组件销毁之前被调用
    在此钩子中,出于性能的考虑需移除在componentDidMount添加的事件订阅,网络请求等。
    demo如下:

    import React, { Component } from 'react';
    
    class LikeButton extends Component {
      constructor(props) {
        super(props);
        this.state = { liked: false };
      }
    
      handleClick(e) {
        this.setState({ liked: !this.state.liked });
      }
    
      render() {
        const text = this.state.liked ? 'like' : 'haven\'t liked';
        return (
          <p onClick={this.handleClick.bind(this)}>
              You {text} this. Click to toggle.
          </p>
        );
      }
    
      componentDidMount(){
        //添加事件订阅,额外的DOM处理
      }
    
      componentWillUnmount(){
        //移除在componentDidMount添加的事件订阅,网络请求等
      }
    }
    

    总结

    在Vue中,state对象并不是必须的,数据由data属性在Vue对象中进行管理。大型应用的状态管理框架有Vuex。

    export default {
      name: 'app',
      data() {
        return {
          samplePasta: samplePasta,
          orders: {}
        }
      },
    ...
      methods: {
        handleOrder(){
            //.....
        }
        }
      }
    }

    而在React中是State驱动视图概念,对应的有setState()方法去更新状态,类似的状态管理框架有redux等。

    阅读更多

    没有更多推荐了,返回首页