美文网首页前端开发
Vue使用nextTick获取最新的DOM

Vue使用nextTick获取最新的DOM

作者: Grit_1024 | 来源:发表于2020-12-14 18:55 被阅读0次

    Vue使用nextTick获取最新的DOM

    1.上代码

    每点击一次,则会向数组内增加三项

    <body>
        <div id='app'>
            <h1>使用nextTick 获取最新的dom</h1>
            <ul ref='list'>
                <li v-for="(item,index) in lisData" :key='index'> {{item}}</li>
            </ul>
            <button @click=additem()>点击</button>
        </div>
        <script>
            new Vue({
                el: '#app',
                data: {
                    lisData: ['第一项', '第二项', '第三项',]
                },
                methods: {
                    additem() {
                        // vue的dom更新是异步的。
                        this.lisData.push(Date.now())
                        this.lisData.push(Date.now())
                        this.lisData.push(Date.now())
                        const listref = this.$refs.list;
                        console.log(listref.childNodes);
                        console.log(listref.childNodes.length);
                    }
                }
            })
        </script>
    </body>
    
    2.当我点击一次按钮的时候,我们发现打印出来的数组只有3项,并且数组长度是3,但是原本数组是有3项的,应该有6项才对,这是什么原因呢?
    原因是:vue 更新dom是异步的!!!
    image.png
    往数组push新的值的时候不是dom马上更新的,而是异步渲染的,如果我们要获取最新的dom的话就可以使用nextTick,实际他就是实例上的 一个方法,直接调用就好了

    代码如下:

    <body>
        <div id='app'>
            <h1>使用nextTick 获取最新的dom</h1>
            <ul ref='list'>
                <li v-for="(item,index) in lisData" :key='index'> {{item}}</li>
            </ul>
            <button @click=additem()>点击</button>
    
        </div>
        <script>
            new Vue({
                el: '#app',
                data: {
                    lisData: ['第一项', '第二项', '第三项',]
                },
                methods: {
                    additem() {
                        // vue的dom更新是异步的。
                        this.lisData.push(Date.now())
                        this.lisData.push(Date.now())
                        this.lisData.push(Date.now())
                        this.$nextTick(() => {
                            const listref = this.$refs.list;
                            console.log(listref.childNodes);
                            console.log(listref.childNodes.length);
    
                        })
                    }
                }
            })
        </script>
    </body>
    
    
    image.png
    现在来看打印出来的结果:数组的长度是6,数组内有6项,Vue使用nextTick获取最新的DOM
    vue的更新是批量的更新(只有是异步的才能做到批量更新的效果,如果是同步的话,每次更新一次就会渲染一次,会消耗性能)比如我修改了三次,实际nextTicK只会执行一次,减少对性能的消耗,

    相关文章

      网友评论

        本文标题:Vue使用nextTick获取最新的DOM

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