在使用vue开发过程当中常常会接触到生命周期的问题,但对于每一个钩子函数都作了什么,应用场景比较模糊,但愿经过此次梳理让本身清楚一些。初次写文章,有不对的地方还望各位多多指正!vue
1. vue实例化过程
从vue实例化开始分析,咱们经过new Vue来实例化来查看一下源码 在 src/core/instance/init.js 中定义 使用vscode的小伙伴推荐使用Search node_modules插件查找node_modules中的插件方便多了,妈妈不再用担忧我迷路了node
Vue.prototype._init = function (options?: Object) { initLifecycle(vm) initEvents(vm) initRender(vm) callHook(vm, 'beforeCreate') initInjections(vm) // resolve injections before data/props initState(vm) initProvide(vm) // resolve provide after data/props callHook(vm, 'created') if (process.env.NODE_ENV !== 'production' && config.performance && mark) { vm._name = formatComponentName(vm, false) mark(endTag) measure(`vue ${vm._name} init`, startTag, endTag) } if (vm.$options.el) { vm.$mount(vm.$options.el) } }
Vue 初始化主要就干了几件事情,合并配置,初始化生命周期,初始化事件中心,初始化渲染,初始化 data、props、computed、watcher 等等,vue 把不一样的功能逻辑拆成一些单独的函数执行。web
咱们关注到,在这个过程当中插入钩子函数,提供给开发者调用的机会。在初始化的最后,检测到若是有 el 属性,则调用 vm.$mount 方法挂载 vm,挂载的目标就是把模板渲染成最终的 DOM。ajax
2.生命周期钩子
- 生命周期钩子自动绑定this到实例上,所以你能够经过this.操做访问到数据和方法。注意不能使用箭头函数例以下方代码,由于箭头函数绑定外层的this会一直往上找。
created:()=>{// ...代码}
复制代码
- 下面用在各个生命周期中打印下el,data,dom节点
export default { name: 'App', data() { return { title: '标题' } }, methods: { onDestoryClick() { this.$destroy() } }, beforeCreate() { console.log( `\n\nbeforeCreate打头\n$el :${this.$el}\n$data :${JSON.stringify( this.$data )}\n$refs.head :${JSON.stringify( this.$refs.head )}\nbeforeCreate结尾\n\n` ) console.log(this.$vnode) }, created() { console.log( `\n\ncreated打头\n$el :${this.$el}\n$data :${JSON.stringify( this.$data )}\n$refs.head :${JSON.stringify(this.$refs.head)}\ncreated结尾\n\n` ) console.log(this.$vnode) }, beforeMount() { console.log( `\n\nbeforeMount打头\n$el :${this.$el}\n$data :${JSON.stringify( this.$data )}\n$refs.head :${JSON.stringify(this.$refs.head)}\nbeforeMount结尾\n\n` ) console.log(this.$vnode) }, mounted() { console.log( `\n\nmounted打头\n$el :${this.$el}\n$data :${JSON.stringify( this.$data )}\n$refs.head :${JSON.stringify(this.$refs.head)}\nmounted结尾\n\n` ) console.log(this.$vnode) } }
