一、vue的生命周期:
包括 created, mounted, updated, destroyed, 以及各自的before钩子。
参考 vue 生命周期图示
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 实例指示的所有东西都会解绑定,
//所有的事件监听器会被移除,
//所有的子实例也会被销毁。
}
});
二、vue的父子间的渲染和销毁周期:
- 加载渲染过程:
- 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
- 更新过程:
- 父beforeUpdate->子beforeUpdate->子updated->父updated
- 销毁过程
- 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
三、React生命周期:
一个React组件的生命周期分为三个部分:挂载期(Mounting)、存在更新期(Updating)和销毁时(Unmounting)。
class Welcome extends React.Component {
// 继承react的props,和设置state的初始化
constructor(props) {
super(props); //不能缺少
this.state = {
color: props.initialColor
};
}
// 类似Vue的beforeMoute,只mount前调用一次,在 render 之前调用
componentWillMount();
/* 类似Vue的template 该方法会创建一个虚拟DOM,用来表示组件的输出。
render方法需要满足下面几点:
1.只能通过 this.props 和 this.state 访问数据(不能修改)
2.可以返回 null,false 或者任何React组件
3.只能出现一个顶级组件,不能返回一组并列元素(**react16也支持返回数组了**)
4.不能改变组件的状态
5.不能修改DOM的输出
*/
render() {
return <h1>Hello World!</h1>;
}
// 类似Vue的mounted, 在 render 之后调用,从这里开始可以通过 ReactDOM.findDOMNode(this) 获取到组件的 DOM 节点。
componentDidMount() {
//添加事件订阅,额外的DOM处理
};
// 通过改变props或state来驱动视图的更改,会触发以下钩子
componentWillReceiveProps();
// 在react中这是一个性能优化的关键点,当父组件改变,全部子组件都会重新渲染,可以通过该钩子返回false来阻止渲染,此处还有另外一个方法pureComponent
shouldComponentUpdate(nextProps, nextState){
//return boolean
};
// 类似Vue的beforeUpdate
componentWillUpdate();
render();
// 类似Vue的updated
componentDidUpdate();
// 类似Vue的beforeDestroy,组件销毁之前被调用,在此钩子中,出于性能的考虑需移除在componentDidMount添加的事件订阅,网络请求等。
componentWillUnmount() {
//移除在componentDidMount添加的事件订阅,网络请求等
};
}
总结:
- 在Vue中,state对象并不是必须的,数据由data属性在Vue对象中进行管理。大型应用的状态管理框架有Vuex。
- 而在React中是state驱动视图概念,对应的有setState()方法去更新状态,类似的状态管理框架有redux等。