记录-前端性能优化之虚拟列表加载(vue3)

<div class="drawerList" @scroll="testScroll">//最外层div,高度大小一般和可视div高度一致
    <div class="drawerList_div"></div>//占位div
    <div class="drawerList_content" :style="`transform:${getTransform}`">//可视div
        <div class="drawerItem" v-for="(item,index) in showList(drawerTitle)" :key="index">
            ...渲染数据
        <div>
    <div>
<div>




<script setup>
const startOffset = ref(0)
//translate3d且因为没有重排重绘,所以性能更好
//getTransform 计算的高度为当前界面想展示出来的高度,即为可视div的高度
const getTransform = computed(() => {
  return `translate3d(0,${startOffset.value}vw,0)`
})

const start = ref(0)//可视div渲染出来的第一个元素的下标,做个标记
const testScroll = (event) => {
  let scrollTop = event.target.scrollTop//滚动距离
  start.value = Math.floor(scrollTop / 247) * 3//这里的247是我这边每个item的高度,除以3是因为每行有3个,每行一个则不需要除以3
  startOffset.value = ((scrollTop - (scrollTop % 247)) / 17.65625)//这里除以17.65625是我想px单位转为vw单位做兼容用的,直接用px单位的话直接 = scrollTop - (scrollTop % 247)就行
}

//展示在可视div的数据(我这里的cartList和historyList是根据不同接口返回的总数据源)
const showList = computed(() => {
  return (drawerTitle) => {
    if (drawerTitle==='已选款') {
      return cartList.value.slice(start.value,start.value+9) //这里+9是我的可视div,一屏可以看到9条
    } else {
      return historyList.value.slice(start.value,start.value+9)
    }
  }
})
<script setup>



css部分
.drawerList{
    width:100%;
    height: calc(100% - 7.8vw);//必须写个固定高度
    overflow-y: auto;//让下方占位的div撑大,出现滚动条
    position: relative;//这个想对定位的处理是让下方可视div可以相对滚动
    .drawerList_div{//此div为占位div,
       width: 100%;
       height: 1000vw;//临时测试写的高度,实际开发过程中需用计算属性计算,计算方式根据你布局的方式(ex:一行一个item,则高度为item的高度*item的总个数;如果一行为3个item,则高度为每行的高度*item的总条数/3,我这里就是每行为3个的布局)
       position: absolute;
       left: 0;
       top: 0;
       z-index: -1;
     }
    .drawerList_content{//可视div
       display: flex;
       flex-wrap: wrap;
       padding: 17px 32px;
       width:100%;
       height: 100%;
       padding-right: 18px;
       .drawerItem{//item数据
          background: #FFFFFF;
          border: 1px solid rgba(221,221,221,1);
          border-radius: 4px;
          margin-bottom: 12px;
          margin-right: 9px;
          width: calc(33.3% - 10px);
          margin-right:10px;
          overflow:hidden;
          height: fit-content;
       }
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 前端性能优化可以从以下几个方面入手: 1. 代码优化:使用合适的数据绑定方式,避免不必要的计算和渲染。合理使用计算属性、watcher 和 v-if/v-show 等指令,避免频繁的重新渲染。同时,注意避免在模板中使用复杂的表达式和函数调用。 2. 组件拆分和懒:将大型组件拆分成更小的组件,按需。这样可以降低首次时的资源压力,提高页面初始化速度。使用 Vue 的异步组件和路由懒功能,可以在需要时再去组件。 3. 图片优化:使用合适的图片格式和压缩工具来减小图片大小,提高速度。可以使用工具将图片转为 WebP 格式,并通过 CDN 速图片。 4. 路由优化:使用懒和异步组件,减少首次时需要的资源。合理使用路由懒,按需所需的组件。 5. 数据请求优化:减少不必要的接口请求,合并接口请求,避免频繁的网络请求。合理使用缓存和本地存储,减少对服务器的依赖。 6. 代码分割和打包优化:使用工具将代码按需分割成多个文件,利用浏览器的并行能力,快页面速度。对打包后的资源进行压缩和混淆,减小文件大小。 7. 使用虚拟列表和无限滚动:对于大量数据的展示,可以使用虚拟列表或者无限滚动技术,只渲染可见区域的数据,提高列表性能。 8. 优化重绘和回流:避免频繁的 DOM 操作和样式改变,合理使用 CSS transform 和 opacity 等属性来减少重绘和回流。将频繁改变的元素设置为 fixed 或 absolute 定位,可以避免重新布局。 以上是一些常见的 Vue 前端性能优化的方法,根据具体项目的需求和实际情况,可以选择适合的优化方案来提高页面性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值