vue使用的是mvvm框架,所以vue不希望开发者直接像jq一样直接操作dome,如果开发者还是喜欢直接操作dome,这时,$nextTick就发挥了很重要的作用。
原文链接:vue $nextTick
我在做即时通讯的时候,使用v-for显示用户发送的历史信息,按照微信、QQ等聊天工具的习惯,历史信息从上往下,最新的信息越靠近手机底部,v-for是从上往下循环渲染的,当我们一进入页面,需要把显示信息的div自动滚动到底部,让用过看最新消息,这个时候我们需要操作dome去滚动。
我们先滚动
var mesbox = document.querySelector('.mesbox') //获取装着信息dome
mesbox.scrollTop = mesbox.scrollHeight //让 dome的滚动条顶部 = dome的高度
经常写原生js的对这两行代码应该非常熟悉。ajax获取到数据 赋值给要v-for的变量后,加入这两行滚动代码,测试后发现,根本没有进行滚动操作。因为v-for循环渲染是同步的,就是说在循环渲染的同时js代码还在继续向下执行,就导致v-for还没渲染完就进行滚动操作。
这个时候,$nextTick就派上用场了!
this.$nextTick(() =>{
var mesbox = document.querySelector('.mesbox') //获取装着信息dome
mesbox.scrollTop = mesbox.scrollHeight //让 dome的滚动条顶部 = dome的高度
})
$nextTick会在dome循环渲染完成后调用,这样就能在ajax获取到数据v-for循环渲染后滚动dome到底部,让用户从下往上查看历史信息。