vue组件实例的生命周期
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div id="demo"></div> <script src='https://cdn.bootcss.com/vue/2.3.2/vue.js'></script> <script> var vm = new Vue({ el: '#demo', beforeCreate: function () { console.log("开始初始化时同步调用,此时数据观察,事件都没有初始化"); }, created: function () { console.log('已经完成实例的创建'); }, beforeMount: function () { console.log("在模版编译之前执行"); }, mounted: function () { console.log("模版编译完成"); }, beforeUpdate: function () { console.log("更新数据前"); }, updated: function () { console.log('如果你要更新数据,那么每次更新数据之后就会调用'); }, beforeDestroy: function () { console.log("开始销毁实例时调用,此用的实例依然有用"); }, destroyed: function () { console.log("实例已销毁"); }, activated: function () { console.log("动态组件初始化渲染过程中调用,需要keep-live配合使用"); }, deactivated: function () { console.log("动态组件移出过程中调用,需要keep-live配合使用"); } }); </script> </body> </html>
对钩子函数一个比较通俗易懂的解释:
Vue在实例化一个组件时会在特定的阶段调用特定的方法,调用的这个方法就叫钩子方法,比如Vue在实例化组件之初按顺序调用beforeCreated,created,beforeMounted,mounted,每个阶段组件内部的属性都是不一样的,比如created钩子时视图还没有渲染,就不能做一些dom操作。所以一般特定的钩子做特定的事,比如ajax获取数据就可以在mounted阶段,当然放在created,beforeMounted也是可以的,因为ajax是异步的嘛,ajax之后的回调会放在事件队列的尾部,此时实例化组件整个过程会在ajax回调之前执行完毕。所以ajax操作放在created,mounted里面都是可以的。
参考文章:https://segmentfault.com/a/1190000008010666