Vue中nextTick

72 阅读1分钟

1.$nextTick的作用

获取更新后的dom
beforeCreate、created、beforeMount想要获取dom,就要使用nextTick
我的axios封装笔记

<template>
   <div>
       <ul id = 'uls'>
           <li v-for = 'item in list' :key = item.id>
               <img :src='item.imageUrl'>
           </li>
       </ul>
   </div>
   
   <script>
       import { ABC } from 'xxx/api/course.js'
       //ABC来自axios的二次封装,需要了解axios二次封装方法的详情请点击上方我的axios封装笔记
       
       export default {
           data(){
               return {
                   list:[]
               }
           },
           beforeCreate(){
               console.log(document.getElementById('uls'))  //undefined
               //在beforeCreate中是获取不到data和dom,但是我们使用了nextTick后
               this.$nextTick(() => {
                   console.log(document.getElementById('uls'))  //<ul id='uls'>...</ul>
               })
           }
       }
   </script>
</template>

2.原理

<body>
    <div id="app">这是一个dom</div>
</body>
<script type="text/javascript">
    class Vue {
        constructor(options){
            this.data = options.data;
            this.$el = document.querySelector(options.el)
            options.created.bind(this)();
        }
        $nextTick(callback){
            return Promise.resolve().then(() => {
                callback();
            })
        }
    }
    
    new Vue({
        el:'#app',
        data:{
            str:'你好'
        }
        created(){
            console.log(this.$el, this.$data);  //undefined  {str:'你好'}
            this.nextTick(() => {
                console.log(this.$el, this.$data); //<div id="app">这是一个dom</div>  {str:'你好'}
            })
        }
    })
</script>