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中的类数组对象介绍
Dec 30 Javascript
js数组依据下标删除元素
Apr 14 Javascript
Jquery数字上下滚动动态切换插件
Aug 08 Javascript
javascript判断复选框是否选中的方法
Oct 16 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
Dec 01 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 Javascript
javascript异步编程的六种方式总结
May 17 Javascript
详解django模板与vue.js冲突问题
Jul 07 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
Sep 26 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
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基于单例模式封装mysql类完整实例
2016/10/18 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python访问MySQL封装的常用类实例
2014/11/11 Python
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python的socket编程入门
2018/01/29 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
如何在django中实现分页功能
2020/04/22 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
小学生节约用水倡议书
2014/05/15 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers