在以前的 Vue 学习中,咱们在使用 Vue 时,都会建立一个 Vue 的实例,而每一个 Vue 实例在被建立时都要通过一系列的初始化过程。例如,须要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。在这个过程当中,Vue 会运行一些生命周期钩子函数,而咱们则能够在钩子函数中编写一些自定义方法,用以在 Vue 的整个生命周期中某些阶段实现咱们特殊需求。那么,本章,咱们就来了解 Vue 实例的生命周期钩子函数。javascript
仓储地址:Chapter01-Rookie Lifecycle Hookshtml
在咱们使用 Vue 的时候,都会先建立一个 Vue 实例,这个实例不只是咱们挂载 Vue 框架的入口,也是 MVVM 思想中的 VM(ViewModel)。在咱们使用 Vue 的整个过程当中,归根结底都是在对这个 Vue 实例进行操做。所以,只有当咱们了解 Vue 实例的生命周期以后,才能够更好的实现咱们的业务逻辑。 vue
1、 beforeCreate & createdjava
在咱们经过 new Vue() 建立了一个 Vue 实例以后,会执行 init 方法,此时只会初始化 Vue 实例所包含的一些默认的事件与生命周期函数,在这个实例还未被彻底建立以前,则会执行咱们的 beforeCreate 钩子函数。git
在下面的例子中,咱们在实例化 Vue 对象时,自定义了一个 message 属性,同时设定了一个 show 方法,如今咱们来看看当实例并无彻底被建立以前,是否可以获取到咱们自定义的属性与方法。程序员
<div id="app">
{{message}}
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, beforeCreate() { console.log(`Vue 实例挂载对象 el:${this.$el}`) console.log(`Vue 实例的 data 对象:${this.$data}`) console.log(`Vue 实例的 message 属性值:${this.message}`) console.log(`Vue 实例的 methods 对象:${this.$options.methods}`) this.show(); } }) </script>
复制代码
当 beforeCreated 钩子函数执行完成后,Vue 实例已经初始化完成,此时将要执行生命周期中的 created 钩子函数来监听咱们对于数据的更改或是监听事件。github
<div id="app">
{{message}}
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, created() { console.log(`Vue 实例挂载对象 el:${this.$el}`) console.log(`Vue 实例的 data 对象:${this.$data}`) console.log(`Vue 实例的 message 属性值:${this.message}`) console.log(`Vue 实例的 methods 对象:${this.$options.methods}`) this.show(); } }) </script>
复制代码
2、 beforeMount & mounted编程
当 Vue 实例执行完 beforeCreated、created 钩子函数以后,Vue 实例已经初始化完成,而 Vue 实例并无挂载到页面的 DOM 上。在挂载到页面 DOM 元素以前,则须要执行 beforeMount 钩子函数将咱们的实例绑定到模板上进行编译渲染。segmentfault
<div id="app">
<h3 id="h3">{{message}}</h3>
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, beforeMount() { console.log(document.getElementById('h3').innerText) } }) </script>
复制代码
当把编译完成的模板挂载到页面上时,则须要执行 mounted 钩子函数,在这个阶段,用户就能够看到已经渲染好的页面。浏览器
<div id="app">
<h3 id="h3">{{message}}</h3>
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, mounted() { console.log(document.getElementById('h3').innerText) } }) </script>
复制代码
从上面的例子中能够看出,mounted 是建立 Vue 实例过程当中的最后一个生命周期钩子函数,当执行完 mounted 钩子函数以后,实例已经被完成建立好,并已经渲染到页面中,此时,若是咱们不对实例进行任何的操做的话,Vue 实例则不会执行 新的生命周期钩子函数。
3、 beforeUpdate & updated
在执行完了 mounted 钩子函数以后,Vue 实例实际已经脱离了实例的建立阶段,进入实例的运行阶段。此时,当咱们对实例的 data 进行修改时,则会触发 beforeUpdate、updated 这两个钩子函数。
<div id="app">
<h3 id="h3">{{message}}</h3>
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, beforeUpdate() { console.log(`页面上的数据:${document.getElementById('h3').innerText}`) console.log(`data 中的 message 数据:${this.message}`) } }) </script>
复制代码
Vue 做为一个具备数据双向绑定特性的框架,当咱们实时修改了页面元素的值以后,确定但愿页面能够同步变动数据。而在执行 beforeUpdate 钩子函数以后,咱们已经在实例中修改了数据,如今只须要从新渲染到页面就能够了,这时候,则会执行 updated 钩子函数。
<div id="app">
<h3 id="h3">{{message}}</h3>
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, updated() { console.log(`页面上的数据:${document.getElementById('h3').innerText}`) console.log(`data 中的 message 数据:${this.message}`) } }) </script>
复制代码
4、 beforeDestroy & destroyed
既然有 Vue 实例的建立,那么在咱们不须要 Vue 实例的时候就须要将这个实例进行销毁。而 beforeDestroy 以及 destroyed 钩子函数则会帮咱们实现这一目的。
<div id="app">
{{message}}
</div>
<script> var vm = new Vue({ el: '#app', data: { message: 'Hello World!' }, methods: { show() { console.log('执行了 show 方法'); } }, beforeDestroy() { console.log(`Vue 实例挂载对象 el:${this.$el}`) console.log(`Vue 实例的 data 对象:${this.$data}`) console.log(`Vue 实例的 message 属性值:${this.message}`) console.log(`Vue 实例的 methods 对象:${this.$options.methods}`) this.show(); }, destroyed() { console.log(`Vue 实例挂载对象 el:${this.$el}`) console.log(`Vue 实例的 data 对象:${this.$data}`) console.log(`Vue 实例的 message 属性值:${this.message}`) console.log(`Vue 实例的 methods 对象:${this.$options.methods}`) this.show(); } }) </script>
复制代码
钩子函数 | 描述 |
---|---|
beforeCreate | Vue 实例进行初始化,此时实例的各个组件尚未进行初始化完成,所以不能访问到 data、computed、watch、methods 上的方法和数据,同时,Vue 实例的挂载点也没有进行初始化 |
created | Vue 实例初始化完成,此时能够访问 data、computed、watch、methods 上的方法和数据,可是依旧没有进行 Vue 实例的挂载点初始化 |
beforeMount | 将实例绑定到模板并进行渲染,但并不会将实例挂载到页面上 |
mounted | 将渲染好的模板绑定到页面上,此时,Vue 实例已彻底建立好 |
beforeUpdate | 数据变动时调用,在实例数据更改以前执行任何应该发生的自定义逻辑或操做 |
updated | 将 Vue 实例更新完成的数据从新渲染到内存中的虚拟 DOM 上,再将虚拟 DOM 应用到页面上 |
beforeDestroy | Vue 实例进入销毁阶段,此时实例上的 data、methods、过滤器、指令等等仍是处于可用的状态,尚未真正执行销毁的过程(解除与页面 DOM 元素的绑定) |
destroyed | 实例被销毁(解除与页面 DOM 元素的绑定) |
七、Vue.js – lifecycle hooks, the layman’s overview
占坑
做者:墨墨墨墨小宇
我的简介:96年生人,出生于安徽某四线城市,毕业于Top 10000000 院校。.NET程序员,枪手死忠,喵星人。于2016年12月开始.NET程序员生涯,微软.NET技术的坚决坚持者,立志成为云养猫的少年中面向谷歌编程最厉害的.NET程序员。
我的博客:yuiter.com
博客园博客:www.cnblogs.com/danvic712