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 相关文章推荐
音乐播放用的的几个函数
Sep 07 Javascript
jQuery DIV弹出效果实现代码
Jul 03 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
Feb 25 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
JS将制定内容复制到剪切板示例代码
Feb 11 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
May 27 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
Aug 15 Javascript
AngularJS教程之环境设置
Aug 16 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
Jan 19 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
element ui table(表格)实现点击一行展开功能
Dec 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
Laravel 队列使用的实现
2019/01/08 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
jQuery插件pagination实现分页特效
2015/04/12 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python实现感知器算法详解
2017/12/19 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Python字符串对象实现原理详解
2019/07/01 Python
学习和使用python的13个理由
2019/07/30 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
大学竞选班干部演讲稿
2014/08/21 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
会议主持人开场白台词
2015/05/28 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python