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 可排列的表实现代码
Nov 13 Javascript
JQuery下关于$.Ready()的分析
Dec 13 Javascript
JavaScript打字小游戏代码
Dec 26 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
Jan 10 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
第九章之路径分页标签与徽章组件
Apr 25 Javascript
JS判断日期格式是否合法的简单实例
Jul 11 Javascript
Vue.js双向绑定实现原理详解
Dec 22 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
世界上最短的数字判断js代码
Sep 09 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
Nov 12 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 动态执行带有参数的类方法
2009/04/10 PHP
php写的简易聊天室代码
2011/06/04 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php笔记之:AOP的应用
2013/04/24 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
php自定文件保存session的方法
2014/12/10 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
JS实现时间校验的代码
2020/05/25 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
python3实现基于用户的协同过滤
2018/05/31 Python
Python线程同步的实现代码
2018/10/03 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
python中wheel的用法整理
2020/06/15 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
电话营销开场白
2015/05/29 职场文书