美文网首页
Vue - vue.nextTick()

Vue - vue.nextTick()

作者: ElricTang | 来源:发表于2019-11-04 08:44 被阅读0次

    在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

    一. 意义:

    • 修改数据后,并不是马上就渲染到DOM上面的,vue还需要进行一系列的操作(通知watcher更新等等)。
    • vue.nextTick()保证了回调在数据更新好后执行。
    • 我们不知道什么时候完成这些操作,vue.nextTick()出现后也就不用管什么时候完成,只需要把完成后要干的事作为回调传入vue.nextTick()就行。

    二. 使用方法:

    1. 传入回调

    // 修改数据
    vm.msg = 'Hello'
    // DOM 还没有更新
    Vue.nextTick(function () {
      // DOM 更新了
    })
    

    2. 作为一个 Promise 使用 (2.1.0 起新增 )

    // 修改数据
    vm.msg = 'Hello'
    Vue.nextTick()
      .then(function () {
        // DOM 更新了
      })
    

    三. 使用场景:

    1. 在生命周期钩子函数created()中使用

    • 因为created阶段DOM尚未渲染,无法执行DOM操作。使用vue.nextTick()将回调延迟到DOM渲染完成后自动执行。
        <body>
            <div id='app'>
                <span ref="msg"></span>
            </div>
            <script>
                var vm=new Vue({
                    el:'#app',
                    data:{
                    },
                    created(){
                        this.$nextTick(()=>{
                            this.$refs.msg.innerText = 'hello world';
                        })      
                    }
                })
            </script>
        </body>
    

    2. 更新数据后想获取新内容

    • 更新后直接获取DOM
        <body>
            <div id='app'>
                <span id='target'>{{msg}}</span>
                <button @click="change">change value</button>
            </div>
            <script>
                var vm=new Vue({
                    el:'#app',
                    data:{
                        msg:'hello world'
                    },
                    methods:{
                        change(){
                            this.msg = 'value has been changed';
                            let target = document.getElementById('target');
                            console.log(target.innerText);
                        }
                    }
                })
            </script>
        </body>
    
    • 更新后在nextTick()回调中获取DOM
    methods:{
      change(){
        this.msg = 'value has been changed';
           this.$nextTick(()=>{
              let target = document.getElementById('target');
              console.log(target.innerText);
           })
        }
    }
    

    3. 确保子组件加载完成

    • mounted阶段不会承诺所有的子组件也都一起被挂载。使用vue.nextTick()进行子组件相关操作。

    相关文章

      网友评论

          本文标题:Vue - vue.nextTick()

          本文链接:https://www.haomeiwen.com/subject/cxqlbctx.html