当前位置:   article > 正文

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

vue3 vue-virtual-scroller

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

官方文档:vue-virtual-scroller

安装依赖

  1. npm install --save vue-virtual-scroller@next
  2. pnpm install --save vue-virtual-scroller@next
  3. yarn add vue-virtual-scroller@next

组件导入

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

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

使用试试

使用固定高度的RecycleScroller组件:

  1. <template>
  2. <RecycleScroller
  3. class="scroller"
  4. :items="list"
  5. :item-size="32"
  6. key-field="id"
  7. v-slot="{ item }"
  8. >
  9. <div class="user">
  10. {{ item.name }}
  11. </div>
  12. </RecycleScroller>
  13. </template>
  14. <script>
  15. export default {
  16. props: {
  17. list: Array,
  18. },
  19. }
  20. </script>
  21. <style scoped>
  22. .scroller {
  23. height: 100%;
  24. }
  25. .user {
  26. height: 32%;
  27. padding: 0 12px;
  28. display: flex;
  29. align-items: center;
  30. }
  31. </style>

使用动态高度的DynamicScroller组件:

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

  1. <DynamicScroller
  2. :items="messageList"
  3. :min-item-size="32"
  4. class="liveMeg"
  5. id="liveMsg"
  6. ref="liveMsg"
  7. v-if="messageList.length"
  8. >
  9. <template v-slot="{ item, active }">
  10. <DynamicScrollerItem
  11. :item="item"
  12. :active="active"
  13. class="msgBox"
  14. :size-dependencies="[item.name, item.msg]"
  15. :data-index="item.id"
  16. >
  17. <div class="content">
  18. <span class="name">{{ item.name }}:</span>
  19. <span class="msg">{{ item.msg }}</span>
  20. </div>
  21. </DynamicScrollerItem>
  22. </template>
  23. </DynamicScroller>
  24. css样式:
  25. .liveMeg {
  26. flex: 1;
  27. margin-left: 10px;
  28. background-color: #252632;
  29. border-radius: 10px;
  30. box-shadow: 0 0 10px 2px gray;
  31. scrollbar-color: #363741 transparent;
  32. scrollbar-width: thin;
  33. overflow-y: scroll;
  34. .msgBox {
  35. display: flex;
  36. flex-direction: row;
  37. padding: 5px;
  38. white-space: wrap;
  39. .name {
  40. color: #8ce7ff;
  41. margin-right: 2px;
  42. white-space: nowrap;
  43. }
  44. .msg {
  45. color: white;
  46. white-space: wrap;
  47. }
  48. }
  49. }

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

自动滚动到底部

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/798531
推荐阅读
相关标签
  

闽ICP备14008679号