Vue知识点(生命周期)

Posted by Asser's Blog on August 15, 2018

Vue知识点汇总

生命周期

先初始化一个全局的vue对象

	import App from './App'
	window.vm = new Vue(
		el: '#app',
		components: { App },
		template: '<App/>'
	)
beforeCreated
实例创建之后(全局new的Vue对象已经存在),数据初始化之前的状态。
此时,直接获取data中的属性会拿到undefined,直接获取props中的属性会直接报错(this.$props为undefined)
一般在此状态显示loading图标
created
在此状态时,判定new Vue对象时有没有传入el参数,
	若没有,则终止生命周期。直到Vue对象调用$mount(el)为止。
接着判断传给Vue对象的参数中有没有template参数
	若有,则将它作为模板编译成render函数。
	若没有,则将外部html作为模板编译
new Vue时还可以传入一个render方法,它以createElement函数作为参数做渲染操作
举个栗子: ````javascript
    new Vue (
    el: '#app',
    render: function(createElement) {
        return createElement('h1', 'Hi, I am Asser!')
    }
) ````
其中的优先级如下:
	render > tempalte > outerHTML

数据初始化之后
此时,data的属性可以正常取值,this.$props下的属性也可以正常取值
一般在此状态
注意:data中的属性无法直接调用另一个属性。假如需要如此操作,需要利用computed进行调用
beforeMounted
在此状态时,创建vm.$el,并且用它替换el属性对应的dom元素
mounted
在此状态时,vm.#el挂载完成,可以对组件内部的dom进行操作
beforeUpdated 和 updated
对data属性中的值进行修改时,会触发视图上的变化
beforeUpdated 和 updated会先后执行

注意:当data的属性为引用类型时(数组或者对象)要特别当心
	对于数组
		当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue ( 使用Vue.set(vm.items, indexOfItem, newValue) )
		当你修改数组的长度时,例如:vm.items.length = newLength ( 使用vm.items.splice(newLength) )

		都不可以更新视图
	对于对象
		Vue 不能检测对象属性的添加或删除 ( 使用Vue.set(vm.userProfile, 'age', 27) )
		在响应式添加新属性时,使用如下方法:
		vm.userProfile = Object.assign({}, vm.userProfile, {
		  age: 27,
		  favoriteColor: 'Vue Green'
		})
同时还需要注意:
	由于事件循环机制,无法在改变data之后,立刻获取更新的视图。假如要实现此种需求,需要使用this.$nextTick(fn)	
beforeDestroy
此时组件实例还是可以正常调动
destroyed
组件实例被销毁后调用,在不使用keep-alive的情况下,切换路由会导致组件实例销毁	
* activated 和 deactivated
keep-alive组件用于缓存对应的组件状态和防止组件重新渲染。
props: inclue和exclude 
	include:使用字符串或者正则表达式,匹配到的组件都会被缓存
	exclude: 使用字符串或者正则表达式,匹配到的组件都不会被缓存

在使用keep-alive组件进行组件缓存操作时,会多出这两个生命周期。

组件被激活时,activated被调用,当组件停用时deactivated被调用,类似于destroyed。
因为在keep-alive下,切换路由时,不会触发destoryed这个hook