beforeCreated阶段
initLifecycle(vm)
initEvents(vm)
initRender(vm)
此时el, data, 以及页面数据为空

created阶段
initInjections(vm)
initState(vm)
initProvide(vm)
实例化创建完成
此时data与数据进行绑定,但dom尚未生成

beforeMount阶段
判断是否有el,没有就会停止生命周期,知道调用vm.$mount(el)
然后判断是否有template,有就编辑模板里的内容,否则会编译外部html的内容
vue中还有一个render函数,它是以createElement作为参数,然后做渲染操作,而且我们可以直接嵌入JSX

mounted阶段
vue实例对象添加$el成员,并且将虚拟dom替换掉挂载的dom元素
这里会有个判断逻辑,如果是外部 new Vue({}) 的话,不会存在 $vnode ,所以直接执行 mounted 钩子了。
如果有子组件的话,会递归挂载子组件,只有当所有子组件全部挂载完毕,才会执行根组件的挂载钩子。

        <div id="app">
            <p @click="handleChange">{{message}}</p>
            <keep-alive>
                <my-components msg="hello" v-if="show"></my-components>
            </keep-alive>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script type="text/javascript">
            var child = {
                template: '<div>from child: {{msg}}{{childMsg}}</div>',
                props: ['msg'],
                data: function(){
                    return {
                        childMsg: 'child1'
                    }
                },
                created: function(){
                    console.group('child create 更新前状态===============》');
                },
                mounted: function(){
                    console.group('child mounted 更新前状态===============》');
                },
                deactivated: function () {
                    console.group('deactivated 更新前状态===============》');
                    console.log('component deactivated!');
                },
                activated: function () {
                    console.group('activated 更新前状态===============》');
                    console.log('component activated');
                }
            }

            var app = new Vue({
                el: '#app',
                data: function() {
                    return {
                        message: 'father',
                        show: true
                    }
                },
                beforeCreate: function() {
                    console.group('beforeCreate状态==========================')
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state)
                },
                created: function() {
                    console.group('created状态==========================')
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state)
                },
                beforeMount: function() {
                    console.group('beforeMount状态==========================')
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state)
                },
                mounted: function() {
                    console.group('mounted状态==========================')
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state)
                },
                methods: {
                    handleChange (){
                        this.message = '123'
                    }
                },
                beforeUpdate: function() {
                    console.group('beforeUpdate 更新前状态===============》');
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state);
                    this.message = '456'
                    this.show = false
                },
                updated: function() {
                    console.group('updated 更新完成状态===============》');
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state);
                },
                beforeDestroy: function() {
                    console.group('beforeDestroy 销毁前状态===============》');
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state);
                },
                destroyed: function() {
                    console.group('destroyed 销毁完成状态===============》');
                    var state = {
                        'el': this.$el,
                        'data': this.$data,
                        'message': this.message
                    }
                    console.log(state);
                },
                components: {
                    'my-components': child
                }
            })
        </script>
02-01 05:03