vue基础06-生命周期

138 阅读1分钟

1.生命周期

  • created:通常在此阶段发送ajax请求,这个生命周期里面就可以获得data里面的数据了
  • mounted:mounted 阶段,一般是用于发起后端请求,获取数据,配合路由钩子做一些事情。
<!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>
    <style>
        .active{
            color: red;
        }
    </style>
</head>

<body>
    <div id="app">
        <!-- 3.使用子组件 -->
        <App></App>

    </div>
    <script src="./vue.js"></script>
    <script>
        /*
        beforeCreate
        created
        beforeMount
        mounted
        beforeUpdate
        updated
        activated 激活
        deactivated 停用
        配合keep-alive
        beforeDestroy
        destroyed
        */
        Vue.component('Test', {
            data() {
                return {
                    msg: "小马哥",
                    isRed:false
                }
            },
            methods: {
                handlerClick() {
                    this.msg = 'alex';
                    this.isRed = true;
                }
            },
            template: `
                <div>

                    <button @click='handlerClick'>改变</button>
                    <h3 :class='{active:isRed}'>{{msg}}</h3>    
                </div>
            `,
            beforeCreate() {
                console.log('组件创建之前', this.$data);//什么数据都拿不到哈
            },
            created() {
                // 非常重要的事情,在此时发送ajax 请求后端的数据
                console.log('组件创建完成', this.$data);//这个时候能够拿到数据了
            },
            beforeMount() {
                // 即将挂载---app内无内容
                console.log('DOM挂载之前', document.getElementById('app'));
            },
            mounted() {
                // 发送ajax---app内由内容
                console.log('DOM挂载完成', document.getElementById('app'));

            },
            beforeUpdate() {
                // 获取更新之前的DOM
                console.log('更新之前的DOM', document.getElementById('app').innerHTML);
            },
            updated() {
                // 获取最新的DOM
                console.log('更新之后的DOM', document.getElementById('app').innerHTML);
            },
            beforeDestroy() {
                console.log('销毁之前');

            },
            destroyed() {
                console.log('销毁完成');

            },
            activated(){
                console.log('组件被激活了');
                
            },
            deactivated(){
                console.log('组件被停用了');
                
            }
        })

        const App = {
            data() {
                return {
                    isShow: true
                }
            },
            components: {},
            methods: {
                clickHandler() {
                    this.isShow = !this.isShow;
                }
            },
            template: `
                 <div>
                    <keep-alive>
                        <Test v-if='isShow'></Test>
                    </keep-alive>
                    <button @click='clickHandler'>改变生死</button>
                </div>
            `,
        }
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                App
            }

        })
    </script>
</body>

</html>

2.问题:vue使用this.$refs.xx在mounted中获取DOM元素为undefined?

1.原因:(mounted需要注意的是加载数据,并不就是更新到dom中去)

如果在 DOM 结构中的某个 DOM 节点使用了 v-if、v-show 或者 v-for(即根据获取到的后台数据来动态操作 DOM,即响应式),那么这些 DOM 是不会在 mounted 阶段找到的。

mounted 阶段,一般是用于发起后端请求,获取数据,配合路由钩子做一些事情。简单来说就是在 mounted 钩子中加载数据而已,加载回来的数据是不会在这个阶段更新到 DOM 中的。所以在 mounted 钩子中使用 $refs。

  • <u>如果 ref 是定位在有 v-if、v-for、v-show 的 DOM 节点中,返回来的只能是 undefined,因为在 mounted 阶段他们根本不存在。</u>

  • 如果说 mounted 阶段是加载阶段,那么 updated 阶段则是完成了数据更新到 DOM 的阶段(对加载回来的数据进行处理),此时,再使用 this.$refs.xx,就 100% 能找到该 DOM 节点。

updated 与 mounted 不同的是,在每一次的 DOM 结构更新,Vue.js 都会调用一次 updated 钩子函数!而 mounted 钩子函数仅仅只执行一次而已。

2.解决:使用$nextTick

  • Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

  • nextTick是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后使用nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 nextTick,则可以在回调中获取更新后的 DOM。