欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue实现渲染数据后控制滚动条位置(推荐)

程序员文章站 2022-04-09 16:25:23
需求场景如下: 实现了消息发送,如果容器内消息过多,会出现滚动条,最新的消息位于最底部,不能及时出现在可视区域内,此时就需要在渲染列表后,将滚动条的位置定位到最底部。先来看看最终实现...

需求场景如下:

实现了消息发送,如果容器内消息过多,会出现滚动条,最新的消息位于最底部,不能及时出现在可视区域内,此时就需要在渲染列表后,将滚动条的位置定位到最底部。先来看看最终实现的效果

Vue实现渲染数据后控制滚动条位置(推荐)  

实现思路

  • 渲染完数据后,通过refs对象获取消息容器的实际高度
  • 将滚动条的设置到最底部

实现过程

sendmessage: function (event) {
  // 数据渲染
  this.sendermessagelist.push(thissendermessageobj);
  // 改变滚动条位置
  this.messagescontainertimer = settimeout(()=>{
    this.$refs.messagescontainer.scrolltop = this.$refs.messagescontainer.scrollheight;
    console.log("当前滚动条位置:"+this.$refs.messagescontainer.scrolltop);
    console.log("当前可滚动区域容器的高度:"+this.$refs.messagescontainer.scrollheight);
    // 清理定时器
    cleartimeout(this.messagescontainertimer);
  },0);
}

踩坑记录

直接设置滚动条的位置

数据渲染完成后直接获取元素的真实高度,设置滚动条的位置,讲道理好像没什么毛病,结果滚动条的高度没有预想的渲染。问题原因:数据渲染完成后,vue此时还没有渲染dom元素,设置的滚动条高度还是之前的容器高度。

sendmessage: function (event) {
  // 数据渲染
  this.sendermessagelist.push(thissendermessageobj);
  // 改变滚动条位置
  this.$refs.messagescontainer.scrolltop = this.$refs.messagescontainer.scrollheight;
  console.log("当前滚动条位置:"+this.$refs.messagescontainer.scrolltop);
  console.log("当前可滚动区域容器的高度:"+this.$refs.messagescontainer.scrollheight);
}

Vue实现渲染数据后控制滚动条位置(推荐)

正确的改变方式: 使用settimeout(),将dom操作改为异步。

this.messagescontainertimer = settimeout(()=>{
  this.$refs.messagescontainer.scrolltop = this.$refs.messagescontainer.scrollheight;
  console.log("当前滚动条位置:"+this.$refs.messagescontainer.scrolltop);
  console.log("当前可滚动区域容器的高度:"+this.$refs.messagescontainer.scrollheight);
  // 清理定时器
  cleartimeout(this.messagescontainertimer);
},0);

总结

以上所述是小编给大家介绍的vue实现渲染数据后控制滚动条位置,希望对大家有所帮助