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 相关文章推荐
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
php中给js数组赋值方法
Mar 10 Javascript
angularjs的一些优化小技巧
Dec 06 Javascript
JS如何生成一个不重复的ID的函数
Dec 25 Javascript
微信小程序 网络请求(post请求,get请求)
Jan 17 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
Mar 21 jQuery
使用ionic播放轮询广告的实现方法(必看)
Apr 24 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
php 修改密码实现代码
May 24 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
Oct 25 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
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
关于document.cookie的使用javascript
2010/10/29 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
让 python 命令行也可以自动补全
2014/11/30 Python
python从入门到精通(DAY 3)
2015/12/20 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
村庄环境整治方案
2014/05/15 职场文书
自荐信格式模板
2015/03/27 职场文书
紧急迫降观后感
2015/06/15 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android