赞
踩
Vue中的生命周期是指:组件从创建到销毁的一个过程,在这过程中,我们在每个特定阶段会触发一些方法(这些方法具备一些功能),我们给这些方法起了名字叫做(生命周期钩子函数/组件钩子)
我们需要在生命周期钩子中实现项目功能,那么我们必须要知道每一个钩子函数的具体用途。
Vue的生命周期分为三个阶段,分别为:初始化,运行中,销毁,一共8个钩子;
生命周期钩子函数不允许写成箭头函数
Vue官网对生命周期的详细示意图
整个生命周期所有钩子函数如下:
<body>
<div id="app">
<Test></Test>
</div>
<template id="test">
<div>
<h3>这是Test组件</h3>
<p> {{ msg }} </p>
</div>
</template>
</body>
<script> new Vue({ el:'#app', components:{ 'Test':{ template:"#test", data(){ return { msg:'Hello 你好' } }, beforeCreate(){ console.log('1-beforeCreate'); console.log('data',this.msg); console.log('真实的dom:',document.querySelector('p')); // fetch('./data.json') // .then(res => res.json()) // .then(data => this.msg = data) // .catch(error=>console.log(error)) }, created(){ console.log('2-created'); console.log("data",this.msg); console.log('真实的dom:',document.querySelector('p')); // fetch('./data.json') // .then(res=>res.json()) // .then(data=>this.msg=data) // .catch(error=>console.log(error)) }, beforeMount () { console.log('3-beforeMount'); console.log('data',this.msg); console.log('真实的dom',document.querySelector('p')); // fetch('./data.json') // .then(res => res.json()) // .then(data => this.msg=data) // .catch(error => console.log(error)) }, mounted () { console.log('4-mounted'); console.log('data',this.msg); console.log('真实的dom',document.querySelector('p')); fetch('./data.json') .then(res => res.json()) .then(data => this.msg = data) .catch(error => console.log(error)) }, // ----------------------- 运行中----------------------- beforeUpdate () { console.log('beforeUpdate'); //通过页面数据查看是否渲染 console.log('data',$refs.msg.innerHTML); console.log('真实的dom',document.querySelector('p')) }, updated () { console.log('update'); //通过页面数据查看是否渲染 console.log('data',$refs.msg.innerHTML); console.log('真实的dom',document.querySelector('p')) } // ----------------------- 销毁阶段----------------------- /* beforeDestroy () { console.log('beforeDestroy') }, destroyed () { console.log('destroyed') } */ } } }) </script>
** 初始化阶段的4个钩子: beforeCreate、created、beforeMount、mounted;**
beforeCreate () {
console.log('1-beforeCreate');
console.log('data',this.msg);//undefined
console.log('真实的dom:',document.querySelector('p'));//null
fetch('./data.json')
.then(res => res.json())
.then(data => this.msg = data)
.catch(error => console.log(error))
}
created () {
console.log('2-created');
console.log("data",this.msg);
console.log('真实的dom:',document.querySelector('p'));
fetch('./data.json')
.then(res => res.json())
.then(data => this.msg = data)
.catch(erro r=> console.log(error))
}
beforeMount () {
console.log('3-beforeMount');
console.log('data',this.msg);
console.log('真实的dom',document.querySelector('p'));
fetch('./data.json')
.then(res => res.json())
.then(data => this.msg=data)
.catch(error => console.log(error))
},
mounted () {
console.log('4-mounted');
console.log('data',this.msg);
console.log('真实的dom',document.querySelector('p'));
fetch('./data.json')
.then(res => res.json())
.then(data => this.msg = data)
.catch(error => console.log(error))
}
总结:数据请求我们一般写在created钩子中,第三方库的实例化我们一般写在mounted钩子中;
运行中阶段有两个钩子:beforeUpdate、updated;
运行中阶段触发条件是:数据更新
数据更新前阶段
beforeUpdate () {
console.log('beforeUpdate');
//重新渲染 VDOM , 然后通过diff算法比较两次vdom,生成patch 补丁对象
console.log('=即将更新渲染=');
console.log('页面data',this.$refs.msg.innerHTML);
console.log('真实的dom',document.querySelector('p'))
},
updated () {
console.log('update');
console.log('==更新成功==');
console.log('data',this.$refs.msg.innerHTML);
console.log('真实的dom',document.querySelector('p'))
}
销毁阶段也是有两个钩子:beforeDestroy、destroyed.这两个钩子用法基本相同。
这两个钩子用法:计时器的关闭 第三方实例的删除
组件销毁需要触发条件:
例子1:通过组件外部定义开关销毁组件
<body> <div id="app"> <Test v-if="flag"></Test> <button @click="flag=!flag">销毁</button> </div> <template id="test"> <div> <h3>这是Test组件</h3> <p ref="msg"> {{ msg }} </p> </div> </template> </body> new Vue({ el:"#app", data:{ flag:true, }, components:{ 'Test':{ template:'#test', data(){ return { msg:'Hello 你好' } }, beforeDestroy () { console.log('beforeDestroy') }, destroyed () { console.log('destroyed') } } } })
例子2:组件内部调用$destroy方法销毁组件
<body>
<div id="app">
<Test v-if="flag"></Test>
</div>
<template id="test">
<div>
<h3>这是Test组件</h3>
<p ref="msg"> {{ msg }} </p>
<button @click = "clear">销毁</button>
</div>
</template>
</body>
new Vue({ el:"#app", components:{ 'Test':{ template:'#test', data(){ return { msg:'Hello 你好' } }, methods:{ //内部通过$destroy方法删除自身组件,触发destroy生命钩子函数 clear() { this.$destroy(); } }, beforeDestroy () { console.log('beforeDestroy'); //组件已经销毁,但是渲染出的真实dom结构未被销毁,手动销毁 document.querySelector('#app').remove() }, destroyed () { console.log('destroyed') } } } })
对比: 内部销毁 vs 外部销毁
以上仅为个人观点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。