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 相关文章推荐
B/S开发中常用javaScript技术与代码
Mar 09 Javascript
Confirmer JQuery确认对话框组件
Jun 09 Javascript
JavaScript等比例缩放图片控制超出范围的图片
Aug 06 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
Oct 28 Javascript
jQuery中队列queue()函数的实例教程
May 03 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
Dec 13 Javascript
jQuery实现滚动效果
Nov 17 jQuery
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
vue-cli系列之vue-cli-service整体架构浅析
Jan 14 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
Dec 11 Javascript
在实例中重学JavaScript事件循环
Dec 03 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/08/05 PHP
php 验证码实例代码
2010/06/01 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Python下使用Psyco模块优化运行速度
2015/04/05 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
python读取中文txt文本的方法
2018/04/12 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
windows支持哪个版本的python
2020/07/03 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
体育教师求职信
2014/05/24 职场文书
幼儿教师求职信
2014/05/24 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python