版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://cloud.tencent.com/developer/article/1347541
React与Vue都有lifecycle生命周期的概念,表示每个组件实例在被创建之前都要经过一系列的初始化过程。比如设置数据监听、编译模板、挂载实例到视图、在数据变化时更新视图等。
所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算。这意味着 你不能使用箭头函数来定义一个生命周期方法 (例如 created: () => this.fetchTodos())。这是因为箭头函数绑定了父上下文,因此 this 与你期待的 Vue 实例不同,this.fetchTodos 的行为未定义。
主要有created、mounted、updated、destroyed,以及各自的before钩子。相比React多了个特殊的activated和deactivated,该钩子只在keep-alive 组件才起作用。
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 实例指示的所有东西都会解绑定,
//所有的事件监听器会被移除,
//所有的子实例也会被销毁。
}
});
在组件的整个生命周期中,随着组件的props或者state发生改变,其视图表现也会有相应的变化。一个组件就是一个状态机,对于特定地输入,它总返回一致的输出。
一个React组件的生命周期分为三个部分:挂载期(Mounting)、存在更新期(Updating)和销毁时(Unmounting)。
当一个组件实例被创建并且插入到DOM中,以下钩子将被调用
constructor(props) {
super(props); //不能缺少
this.state = {
color: props.initialColor
};
}
只mount前调用一次,在 render 之前调用,你可以在这个方法里面调用 setState 改变状态,并且不会导致额外调用一次 render,但是一般不建议这么做,在constructor中初始话state。
类似Vue的mounted
只会在装载完成之后调用一次,在 render 之后调用,从这里开始可以通过 ReactDOM.findDOMNode(this) 获取到组件的 DOM 节点。
通过改变props或state来驱动视图的更改,会触发以下钩子
shouldComponentUpdate(nextProps, nextState){
//return boolean
}
类似Vue的beforeUpdate、
类似Vue的beforeDestroy 组件销毁之前被调用 在此钩子中,出于性能的考虑需移除在componentDidMount添加的事件订阅,网络请求等。undefined 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等。