1,需求:
使用socket连接后端,每次后端数据到来之后,前端视图将实时更新,使得始终展示最新的数据
2,思路
数据更新时,触发逻辑通过ref传入盒子将其scrollTop设置为盒子高度:
mounted() {
setInterval(() => {
this.setDate();
this.boxScroll(this.$refs.logBox);
}, 3000);
// openWebsocket("ws:", this.dealLog, this.dealLog);
},
methods: {
boxScroll(o) {
o.scrollTop = o.scrollHeight;
},
setDate() {
this.activities.push({
content: "支持使用图标",
timestamp: moment(new Date()).format("YYYY-MM-DD h-m-s"),
});
},
}
后端数据服务还未写好,所以先写了定时器假数据进行测试
3,问题
每次数据更新后,展示的都是倒数第二条数据
原因
功能实现比较简单, 但是现在的问题是, 因为vue视图渲染和取DOM之间有一个时间差,导致取DOM的时候,元素还没有渲染出来,所以取到的scrollHeight不足
现象
每次来新数据,底部显示永远是倒数第二条,想看最后一条,需要滚动一下才行,这样显然不行
4,解决方案
将数据变化触发滚动改为 在update钩子函数中触发:
效果:
做点简单的优化:
当鼠标进入盒子时,滚动条根据鼠标的滚轮来移动;
鼠标不在时,根据数据的更新及时显示底部最新数据