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


Posted in Javascript onDecember 09, 2019

需求场景如下:

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

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实现渲染数据后控制滚动条位置,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
Apr 20 Javascript
Javascript string 扩展库代码
Apr 09 Javascript
Javascript倒计时页面跳转实例小结
Sep 11 Javascript
Java/JS获取flash高宽的具体方法
Dec 27 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
详解node child_process模块学习笔记
Jan 24 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 Javascript
vue响应式系统之observe、watcher、dep的源码解析
Apr 09 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
Aug 08 Javascript
使用Node.js在深度学习中做图片预处理的方法
Sep 18 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 #Javascript
js刷新页面location.reload()用法详解
Dec 09 #Javascript
vue 实现websocket发送消息并实时接收消息
Dec 09 #Javascript
Vue extend的基本用法(实例详解)
Dec 09 #Javascript
vue基于v-charts封装双向条形图的实现代码
Dec 09 #Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 #Javascript
vue如何使用async、await实现同步请求
Dec 09 #Javascript
You might like
php下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP用mysql数据库存储session的代码
2010/03/05 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
重新认识php array_merge函数
2014/08/31 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
Javascript 中的 && 和 || 使用小结
2010/04/25 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
vue-router 权限控制的示例代码
2017/09/21 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
应用艺术毕业生的自我评价
2013/12/04 职场文书
干部作风建设工作总结
2014/10/29 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
导游词之张家界
2019/10/31 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android