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 题型问答有答案参考
Feb 17 Javascript
kmock javascript 单元测试代码
Feb 06 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
Oct 17 Javascript
使用jsonp完美解决跨域问题
Nov 27 Javascript
详解node.js搭建代理服务器请求数据
Apr 08 Javascript
vue axios同步请求解决方案
Sep 29 Javascript
three.js 入门案例详解
Jan 23 Javascript
JavaScript实现简单的文本逐字打印效果示例
Apr 12 Javascript
浅谈Angularjs中不同类型的双向数据绑定
Jul 16 Javascript
微信小程序实现锚点功能
Nov 20 Javascript
vue父子组件间引用之$parent、$children
May 20 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的session cookie错误
2009/08/09 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python3生成随机数实例
2014/10/20 Python
python关键字and和or用法实例
2015/05/28 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
python实战教程之自动扫雷
2018/07/13 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
django celery redis使用具体实践
2019/04/08 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Wallis官网:英国女装零售商
2020/01/21 全球购物
学生干部的自我评价分享
2014/01/18 职场文书
优秀员工事迹材料
2014/12/20 职场文书
教师师德表现自我评价
2015/03/05 职场文书
电影建党伟业观后感
2015/06/01 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书