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 相关文章推荐
限制复选框的最大可选数
Jul 01 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
使用jQuery.wechat构建微信WEB应用
Oct 09 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
May 23 Javascript
Javascript必知必会(四)js类型转换
Jun 08 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
javascript实现Emrips反质数枚举的示例代码
Dec 06 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
Mar 06 Javascript
解决vue axios的封装 请求状态的错误提示问题
Sep 25 Javascript
微信公众号网页分享功能开发的示例代码
May 27 Javascript
JavaScript快速调试的两个技巧
Nov 04 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文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
js CSS操作方法集合
2008/10/31 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
微信小程序动态显示项目倒计时
2019/06/20 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
Python的缺点和劣势分析
2019/11/19 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
python matplotlib库的基本使用
2020/09/23 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
试述DBMS的主要功能
2016/11/13 面试题
abstract class和interface有什么区别
2013/08/04 面试题
制衣厂各岗位职责
2013/12/02 职场文书
教师旷工检讨书
2014/01/18 职场文书
活动总结报告格式
2014/05/09 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
python实现批量移动文件
2021/04/05 Python