前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue与React的异同—生命周期(一)

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

作者头像
空空云
发布2018-09-27 11:50:06
1.7K0
发布2018-09-27 11:50:06
举报
文章被收录于专栏:大前端_Web

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://cloud.tencent.com/developer/article/1347541

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

Vue生命周期

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

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

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

demo如下:

代码语言:javascript
复制
    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的初始化
代码语言:javascript
复制
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文档
代码语言:javascript
复制
shouldComponentUpdate(nextProps, nextState){
    //return boolean
}
  • componentWillUpdate()

类似Vue的beforeUpdate、

  • render()
  • componentDidUpdate() 类似Vue的updated
Unmounting
  • componentWillUnmount()

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
export default {
  name: 'app',
  data() {
    return {
      samplePasta: samplePasta,
      orders: {}
    }
  },
...
  methods: {
    handleOrder(){
        //.....
    }
    }
  }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年01月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vue生命周期
  • React生命周期
    • Mounting
      • Updating
        • Unmounting
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档