当前位置: 首页 > news >正文

vue3长列表优化,使用vue-virtual-scroller实现直播间弹幕列表虚拟滚动效果

使用的组件库是:https://github.com/Akryum/vue-virtual-scroller 

官方文档:vue-virtual-scroller

安装依赖

npm install --save vue-virtual-scroller@nextpnpm install --save vue-virtual-scroller@nextyarn add vue-virtual-scroller@next

组件导入

在main.ts中导入组件,这个依赖库支持RecycleScroller,DynamicScroller,DynamicScrollerItem三个组件,可以全量导入,也可以部分导入。这三个组件区别是滚动每一项高度是固定的还是动态的,Recycle就是固定的高度,Dynamic是动态的,动态的话,必须要包含DynamicScrollerItem。

import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
import VirtualScroller from 'vue-virtual-scroller'app.use(VirtualScroller)

使用试试

使用固定高度的RecycleScroller组件:

<template><RecycleScrollerclass="scroller":items="list":item-size="32"key-field="id"v-slot="{ item }"><div class="user">{{ item.name }}</div></RecycleScroller>
</template><script>
export default {props: {list: Array,},
}
</script><style scoped>
.scroller {height: 100%;
}.user {height: 32%;padding: 0 12px;display: flex;align-items: center;
}
</style>

使用动态高度的DynamicScroller组件:

注意事项:要结合DynamicScrollerItem一起使用,并且要加上active属性才可以,不然会有警告。

<DynamicScroller:items="messageList":min-item-size="32"class="liveMeg"id="liveMsg"ref="liveMsg"v-if="messageList.length"><template v-slot="{ item, active }"><DynamicScrollerItem:item="item":active="active"class="msgBox":size-dependencies="[item.name, item.msg]":data-index="item.id"><div class="content"><span class="name">{{ item.name }}:</span><span class="msg">{{ item.msg }}</span></div></DynamicScrollerItem></template></DynamicScroller>css样式:
.liveMeg {flex: 1;margin-left: 10px;background-color: #252632;border-radius: 10px;box-shadow: 0 0 10px 2px gray;scrollbar-color: #363741 transparent;scrollbar-width: thin;overflow-y: scroll;.msgBox {display: flex;flex-direction: row;padding: 5px;white-space: wrap;.name {color: #8ce7ff;margin-right: 2px;white-space: nowrap;}.msg {color: white;white-space: wrap;}}}

没使用之前页面会渲染超级多个div元素,但是使用这个虚拟列表之后,就只会渲染在视窗里面的元素:页面中元素数量一直就是这多,超过了就不会渲染出来

自动滚动到底部

想要让消息内容自动滚动到底部,适用于直播间弹幕消息或者聊天消息等结构,可以尝试使用这种方式。但是需要注意:获取DynamicScroller这个组件的时候,要使用document.getElementById('liveMsg')这种形式,不能使用ref这种,因为ref获取到的并不是一个html元素,没有scrollTop方法,所以无法滚动到底部。

// 滚动盒子到底部if (liveMsg.value) {const msgDom: HTMLElement | null = document.getElementById('liveMsg')console.log('liveMsg.value--', msgDom)if (msgDom) {msgDom.scrollTop = msgDom.scrollHeight}}

我这就是在收到message消息的时候就执行这个滚动的方法:

最后实现的抖音直播间的弹幕滚动效果:

开源地址:GitHub - Sjj1024/LiveBox: livebox

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VitePress美化
  • webSocket网页通信---使用js模拟多页面实时通信
  • Flink,spark对比
  • Python爬虫之什么是逆向工程?逆向是什么?
  • 实现原理:远程过程调用(RPC)
  • Postman编写测试脚本
  • mybatis-plus参数绑定异常
  • 解析Java中1000个常用类:Date类,你学会了吗?
  • 【Unity2D 2022:Particle System】添加命中粒子特效
  • React 中 useEffect
  • JAVA每日作业day7.4
  • 软件是什么?一个软件到底是哪些部分组成的-软件到底有哪些分支呢?
  • Synchronized、volatile与ReentrantLock:Java并发编程中的同步机制比较
  • docker部署mycat,连接上面一篇的一主二从mysql
  • Windows ipconfig命令详解,Windows查看IP地址信息
  • Angular 响应式表单之下拉框
  • Asm.js的简单介绍
  • CentOS6 编译安装 redis-3.2.3
  • Java超时控制的实现
  • mysql 数据库四种事务隔离级别
  • quasar-framework cnodejs社区
  • 百度小程序遇到的问题
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 搞机器学习要哪些技能
  • 每天一个设计模式之命令模式
  • 排序(1):冒泡排序
  • 漂亮刷新控件-iOS
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用parted解决大于2T的磁盘分区
  • 数组大概知多少
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 学习ES6 变量的解构赋值
  • 运行时添加log4j2的appender
  • # .NET Framework中使用命名管道进行进程间通信
  • $.ajax,axios,fetch三种ajax请求的区别
  • $.each()与$(selector).each()
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)(3.5) 遥测无线电区域条例
  • (day6) 319. 灯泡开关
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (每日一问)基础知识:堆与栈的区别
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十一)手动添加用户和文件的特殊权限
  • (转)创业的注意事项
  • (转载)Linux 多线程条件变量同步
  • .gitignore文件设置了忽略但不生效
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET是什么
  • /run/containerd/containerd.sock connect: connection refused
  • @Bean有哪些属性
  • [ C++ ] STL---string类的模拟实现