美文网首页
nextTick()

nextTick()

作者: 爱恨_交加 | 来源:发表于2020-10-27 00:17 被阅读0次

    定义: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。(说明:Vue 实现响应式并不是在数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新)

    简单理解:当数据更新了,并在DOM中渲染后,便自动执行nextTick()中的回调函数。

    应用场景

    1. Vue生命周期的created()钩子函数中进行的DOM操作一定要放在Vue.nextTick()的回调函数中,原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载已完成。详情看下述的示例二。

    2. 当你想在项目中改变DOM元素的数据后基于新的DOM做点什么,对新DOM一系列的js操作都需要放进Vue.nextTick()的回调函数中;通俗的理解是:更改数据后,当你想立即使用js操作新的视图的时候就需要使用它。

    3. 在使用某个第三方插件时 ,希望在vue生成的某些dom动态发生变化时重新应用该插件,也会用到该方法,这时候就需要在 $nextTick 的回调函数中执行重新应用插件的方法。

    示例一

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>My first Vue app</title>
        <meta charset="UTF-8">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    
    <body>
        <div id="app">
            {{ message }}
        </div>
    
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: '变声前,嗷嗷嗷~'
                }
            })
            app.message = '变声后,嘤嘤嘤~'
            console.log(app.$el.textContent) // 变声前,嗷嗷嗷~
            Vue.nextTick(function () {
                console.log(app.$el.textContent) // 变声后,嘤嘤嘤~
            })
        </script>
    </body>
    
    </html>
    

    示例二

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>My first Vue app</title>
        <meta charset="UTF-8">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    
    <body>
        <div id="app">
            <demo1></demo1>
            <demo2></demo2>
        </div>
    
        <script>
            // 自定义组件
            Vue.component('demo1', {
                template: '<div><span>{{ message }}</span></div>',
                data: function () {
                    return {
                        message: 'demo1:变声前,嗷嗷嗷~'
                    }
                },
                mounted: function(){
                    this.message = 'demo1:变声后,嘤嘤嘤~'
                    console.log(this.$el.textContent) // => 'demo1:变声前,嘤嘤嘤~'
                    this.$nextTick(function () {
                        console.log(this.$el.textContent) // => 'demo1:变声后,嘤嘤嘤~'
                    })
                }
            })
            Vue.component('demo2', {
                template: '<div><span>{{ message }}</span></div>',
                data: function () {
                    return {
                        message: 'demo2:变声前,嗷嗷嗷~'
                    }
                },
                created: function () {
                    this.message = 'demo2:变声后,嘤嘤嘤~'
                    console.log(this.$el) // => 'undefined'
                    this.$nextTick(function () {
                        console.log(this.$el.textContent) // => '变声后,嘤嘤嘤~'
                    })
                }
            })
            var app = new Vue({
                el: '#app'
            })
        </script>
    </body>
    
    </html>
    

    相关文章

      网友评论

          本文标题:nextTick()

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