vue生命周期
1.0_人的-生命周期
一组件从 创建 到 销毁 的整个过程就是生命周期
Vue_生命周期
1.1_钩子函数
目标: Vue 框架内置函数,随着组件的生命周期阶段,自动执行
作用: 特定的时间点,执行特定的操作
场景: 组件创建完毕后,可以在created 生命周期函数中发起Ajax 请求,从而初始化 data 数据
分类: 4大阶段8个方法
- 初始化
- 挂载
- 更新
- 销毁
阶段 | 方法名 | 方法名 |
---|---|---|
初始化 | beforeCreate | created |
挂载 | beforeMount | mounted |
更新 | beforeUpdate | updated |
销毁 | beforeDestroy | destroyed |
下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。
1.2_初始化阶段
目标: 掌握初始化阶段2个钩子函数作用和执行时机
含义讲解:
1.new Vue() – Vue实例化(组件也是一个小的Vue实例)
2.Init Events & Lifecycle – 初始化事件和生命周期函数
3.beforeCreate – 生命周期钩子函数被执行
4.Init injections&reactivity – Vue内部添加data和methods等
5.created – 生命周期钩子函数被执行, 实例创建
6.接下来是编译模板阶段 –开始分析
7.Has el option? – 是否有el选项 – 检查要挂到哪里
没有. 调用$mount()方法
有, 继续检查template选项
components/Life.vue - 创建一个文件
<template>
<div>
<!-- template其实是一个模板,还不是真实的 DOM,挂载后才生成真实的 DOM -->
<h1>这是一个子组件,用来查看生命周期函数</h1>
<h2>{{ msg }}</h2>
</div>
</template>
<script>
export default {
data () {
return {
msg:"hello vue"
}
},
beforeCreate () {
console.log( "beforeCreate -- 执行了");
console.log(document.querySelector('h1'));
console.log(11111,this.msg); // null ,数据还没初始化
},
created () {
console.log( "beforeCreate -- 执行了");
// 注意:初始化阶段其实还没有 DOM
console.log(222222,this.msg); // hello vue ,有数据了
// 一般发送网络请求是在 create 中
setTimeout( () => {
console.log('获取网络数据请求成功');
this.msg = "网络数据"
},1000)
}
}
</script>
<style>
</style>
App.vue - 引入使用
<template>
<div>
<Life></Life>
</div>
</template>
<script>
import Life from './components/Life.vue'
export default {
components: {
Life
}
}
</script>
<style>
</style>
1.3_挂载阶段
目标: 掌握挂载阶段2个钩子函数作用和执行时机
含义讲解:
1.template选项检查
有 - 编译template返回render渲染函数
无 – 编译el选项对应标签作为template(要渲染的模板)
2.虚拟DOM挂载成真实DOM之前
3.beforeMount – 生命周期钩子函数被执行
4.Create … – 把虚拟DOM和渲染的数据一并挂到真实DOM上
5.真实DOM挂载完毕
6.mounted – 生命周期钩子函数被执行
components/Life.vue - 创建一个文件
<template>
<div>
<!-- template其实是一个模板,还不是真实的 DOM,挂载后才生成真实的 DOM -->
<h1>这是一个子组件,用来查看生命周期函数</h1>
<h2>{{ msg }}</h2>
</div>
</template>
<script>
export default {
data () {
return {
msg:"hello vue"
}
},
beforeCreate () {
// console.log( "beforeCreate -- 执行了");
// console.log(document.querySelector('h1'));
// console.log(11111,this.msg); // null ,数据还没初始化
},
created () {
// console.log( "beforeCreate -- 执行了");
// // 注意:初始化阶段其实还没有 DOM
// console.log(222222,this.msg); // hello vue ,有数据了
// // 一般发送网络请求是在 create 中
// setTimeout( () => {
// console.log('获取网络数据请求成功');
// this.msg = "网络数据"
// },1000)
},
beforeMount () {
console.log( "beforeMount -- DOM挂载前");
console.log(33333,document.querySelector('h1'));
},
mounted () {
console.log( "mounted -- DOM挂载完成");
console.log(44444,document.querySelector('h1'));
}
}
</script>
<style>
</style>
1.4_更新阶段
目标: 掌握更新阶段2个钩子函数作用和执行时机
含义讲解:
1.当data里数据改变, 更新DOM之前
2.beforeUpdate – 生命周期钩子函数被执行
3.Virtual DOM…… – 虚拟DOM重新渲染, 打补丁到真实DOM
4.updated – 生命周期钩子函数被执行
5.当有data数据改变 – 重复这个循环
components/Life.vue - 创建一个文件
准备ul+li循环, 按钮添加元素, 触发data改变->导致更新周期开始
<template>
<div>
<!-- template其实是一个模板,还不是真实的 DOM,挂载后才生成真实的 DOM -->
<h1>这是一个子组件,用来查看生命周期函数</h1>
<h2>{{ msg }}</h2>
<ul id="myUL">
<li v-for="(val, index) in arr" :key="index">
{{ val }}
</li>
</ul>
<button @click="arr.push(1000)">点击末尾加值</button>
</div>
</template>
<script>
export default {
data () {
return {
msg:"hello vue",
arr:[1,2,3,4]
}
},
beforeCreate () {
// console.log( "beforeCreate -- 执行了");
// console.log(document.querySelector('h1'));
// console.log(11111,this.msg); // null ,数据还没初始化
},
created () {
// console.log( "beforeCreate -- 执行了");
// // 注意:初始化阶段其实还没有 DOM
// console.log(222222,this.msg); // hello vue ,有数据了
// // 一般发送网络请求是在 create 中
// setTimeout( () => {
// console.log('获取网络数据请求成功');
// this.msg = "网络数据"
// },1000)
},
beforeMount () {
// console.log( "beforeMount -- DOM挂载前");
// console.log(33333,document.querySelector('h1'));
},
mounted () {
// console.log( "mounted -- DOM挂载完成");
// console.log(44444,document.querySelector('h1'));
},
// 只有 data 数据发生变化时
beforeUpdate () {
console.log("beforeUpdate -- DOm结构更新前");
console.log(55555,document.querySelectorAll("#myUL>li")[4]); // undefined
},
// 场景:获取更新后的真实 DOM
updated () {
console.log("updated -- DOm结构更新完成");
console.log(66666, document.querySelectorAll("#myUL>li")[4]); // li
}
}
</script>
<style>
</style>
1.5_销毁阶段
目标: 掌握销毁阶段2个钩子函数作用和执行时机
含义讲解:
1.当$destroy()被调用 – 比如组件DOM被移除(例v-if)
2.beforeDestroy – 生命周期钩子函数被执行
3.拆卸数据监视器、子组件和事件侦听器
4.实例销毁后, 最后触发一个钩子函数
5.destroyed – 生命周期钩子函数被执行
components/Life.vue - 准备生命周期方法(Life组件即将要被删除)
<template>
<div>
<!-- template其实是一个模板,还不是真实的 DOM,挂载后才生成真实的 DOM -->
<h1>这是一个子组件,用来查看生命周期函数</h1>
<h2>{{ msg }}</h2>
<ul id="myUL">
<li v-for="(val, index) in arr" :key="index">
{{ val }}
</li>
</ul>
<button @click="arr.push(1000)">点击末尾加值</button>
</div>
</template>
<script>
export default {
data () {
return {
msg:"hello vue",
arr:[1,2,3,4]
}
},
beforeCreate () {
// console.log( "beforeCreate -- 执行了");
// console.log(document.querySelector('h1'));
// console.log(11111,this.msg); // null ,数据还没初始化
},
created () {
// console.log( "beforeCreate -- 执行了");
// // 注意:初始化阶段其实还没有 DOM
// console.log(222222,this.msg); // hello vue ,有数据了
// // 一般发送网络请求是在 create 中
// setTimeout( () => {
// console.log('获取网络数据请求成功');
// this.msg = "网络数据"
// },1000)
// 定时器是属于浏览器的,启动后,浏览器没关闭或没有清除定时器,定时器就一直在运行
this.timer = window.setInterval(() => {
console.log('启动一个定时器');
},1000)
},
beforeMount () {
// console.log( "beforeMount -- DOM挂载前");
// console.log(33333,document.querySelector('h1'));
},
mounted () {
// console.log( "mounted -- DOM挂载完成");
// console.log(44444,document.querySelector('h1'));
},
// 只有 data 数据发生变化时
beforeUpdate () {
// console.log("beforeUpdate -- DOm结构更新前");
// console.log(55555,document.querySelectorAll("#myUL>li")[4]); // undefined
},
// 场景:获取更新后的真实 DOM
updated () {
// console.log("updated -- DOm结构更新完成");
// console.log(66666, document.querySelectorAll("#myUL>li")[4]); // li
// }
},
beforeDestroy () {
console.log('beforeDestroy -- 组件销毁前');
},
destroyed () {
console.log('destroyed -- 组件销毁完成');
clearInterval(this.timer)
}
}
</script>
<style>
</style>
父组件.vue:
<template>
<div>
<Life v-if="bl"></Life>
<button @click="bl = false">点击销毁组件</button>
</div>
</template>
<script>
import Life from './components/Life.vue'
export default {
components: {
Life
},
data () {
return {
bl:true
}
}
}
</script>
<style>
</style>