vue基础09-nextTick的基础及使用

208 阅读1分钟

1.nextTick例子

  • ①🌵:创建一个vue实例-vm
  • ②🌵:通过vm.message='爱琳琳真的是太好了'去修改vue里面的实例数据
  • ③🌵:修改数据后,再直接通过vm.$el.textContent去获取vue实例中的数据,发现并没有变化,打印结果仍然是--小马哥
  • ④🌵:使用Vue.nextTick方法:
    • ⚠️需要注意的是,vue的数据发生改变了,并不是立刻渲染到dom页面上的,可以在数据变化之后立即使用Vue.nextTick 在当前的回调函数中能获取最新的DOM
  • ⑤🌵:这次vm.$el.textContent的打印结果变成了爱琳琳真的是太好了
<!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="app">
        <h3>{{message}}</h3>
    </div>
    <script src="./vue.js"></script>
    <script>
      	//①🌵
        const vm = new Vue({
            el:'#app',
            data:{
                message:'小马哥'
            }
        })
        //②🌵
        vm.message = '爱琳琳真的是太好了';
         console.log(vm.$el.textContent); //③🌵小马哥
        // 为了数据变化之后等待vue完成更新DOM,可以在数据变化之后立即使用Vue.nextTick 在当前的回调函数中能获取最新的DOM
        //④🌵
        Vue.nextTick(()=>{
           console.log(vm.$el.textContent); // ⑤🌵爱琳琳真的是太好了
        })
        
    </script>
   
</body>
</html>

2.nextTick的应用

🍊需求:

  • 在页面拉取一个接口,这个接口返回一些数据,这些数据是这个页面的一个浮层组件要依赖的,

    然后我在接口一返回数据就展示了这个浮层组件。

  • 展示的同时,上报一些数据给后台(这些数据是父组件从接口拿的)

  • ✏️问题:虽然拿到数据了,但是浮层展现的时候,这些数据还未更新到组件上去,上报失败

<!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='app'>
        <App></App>
    </div>
    <script src="./vue.js"></script>
    <script>
        /* 
        需求:
            在页面拉取一个接口,这个接口返回一些数据,这些数据是这个页面的一个浮层组件要依赖的,
            然后我在接口一返回数据就展示了这个浮层组件,展示的同时,
            上报一些数据给后台(这些数据是父组件从接口拿的),
            这个时候,神奇的事情发生了,虽然我拿到数据了,但是浮层展现的时候,
            这些数据还未更新到组件上去,上报失败
        */

        //浮层组件pop
        const Pop = {
            data() {
                return {
                    isShow: false
                }
            },
            props: {
                name: {
                    type: String,
                    default: ''
                },
            },
            template: `
                <div v-if='isShow'>
                    {{name}}
                </div>
            `,
            methods: {
                show() {
                    this.isShow = true; //弹窗组件展示
                    console.log(this.name);   //①结果为空的;②号打印出小马哥   
                }
            },
        }
        //
        const App = {
            data() {
                return {
                    name: ''
                }
            },
            created() {
                //    模拟异步请求
                setTimeout(() => {
                    // 数据更新
                    this.name = '小马哥';
                  	//this.$refs.pop.show();  ①号🌵
                    this.$nextTick(()=>{
                        this.$refs.pop.show(); //②号🌵
                    })
                }, 1000);
            },
            components: {
                Pop
            },
            template: `<pop ref='pop' :name='name'></pop>`
        }
        const vm = new Vue({
            el: '#app',
            components: {
                App
            }
        })
    </script>
</body>

</html>
  • ①号🌵:这个位置执行的时候,虽然页面的数据更新了,但是控制台打印出的结果是空的。
  • ②号🌵:使用$nextTick函数的回调函数后,也就是在②号位置调用后,控制台可以打印出结果小马哥