效果
客服系统的聊天列表,需求是向上滚动加载更多,直到没有消息.先看效果:

监听滚动
在消息容器上添加监听滚动,距离顶部 200px 就触发加载.这里注意要去抖,防止频繁触发导致浏览器卡顿
1 | this.$refs.chatWrapper.addEventListener("scroll", debounce(this.handleScroll)) |
加载更多
聊天消息列表是一个数组,所有内容用v-for
输出.添加内容只要往数组头部 concat
即可
1 | <div v-for="(chatItem,idx) in chatList " |
保存原来位置
如果直接把新内容添加到数组头部,我们的滚动距离仍然在消息容器的顶部,这样鼠标稍微移动就会再次触发加载

所以我们要保存原来的位置,在消息记录渲染出来后跳到原来的位置
1 | // scrollHeight - scrollTop 为聊天列表需要保留的高度 |
scrollHeight - scrollTop
为聊天列表需要保留的高度,在watch
里监听数组变化,等到数组渲染成具体的dom,在$nextTick
里把容器滚回原来的位置.由于速度很快用户无法察觉列表已经从顶部闪现回来