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 相关文章推荐
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
Jul 26 Javascript
js类型检查实现代码
Oct 29 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
js如何获取object类型里的键值
Feb 18 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
Nov 25 Javascript
JS表格组件神器bootstrap table详解(基础版)
Dec 08 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
React BootStrap用户体验框架快速上手
Mar 06 Javascript
JS实现方形抽奖效果
Aug 27 Javascript
JS实现图片切换特效
Dec 23 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
NOT NULL 和NULL
2007/01/15 PHP
php zip文件解压类代码
2009/12/02 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
Python实现获取网站PR及百度权重
2015/01/21 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
住房抵押登记委托书
2014/09/27 职场文书
2014年加油站工作总结
2014/12/04 职场文书
家长通知书家长意见
2014/12/30 职场文书
大学生个人学年总结
2015/02/15 职场文书
远程教育学习心得体会
2016/01/23 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL