uniapp小程序如何通过虚拟列表配合节流,完成上拉刷新下拉加载,避免页面卡顿,提升性能呢?

这篇具有很好参考价值的文章主要介绍了uniapp小程序如何通过虚拟列表配合节流,完成上拉刷新下拉加载,避免页面卡顿,提升性能呢?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文将介绍uniapp小程序中如何使用虚拟列表和节流两种技术实现上拉刷新下拉加载功能,同时避免因渲染大量数据导致的页面卡顿问题。

一、虚拟列表

在uniapp小程序开发中,当我们需要渲染大量列表数据时,很容易出现页面卡顿现象。这时候,我们可以使用虚拟列表技术来优化性能。

所谓虚拟列表,就是将所有数据分成可视区域和非可视区域两部分。只有在可视区域内的数据才进行渲染,而不在可视区域内的数据暂不渲染,这样就可以大幅度减少DOM操作次数,提高渲染效率。

在uniapp小程序中,使用uni-app中的uni-scroll-view组件需要在插件市场安装

<template>
  <uni-scroll-view :style="{height: height + 'px'}" @scroll="onScroll">
    <ul>
      <li v-for="(item, index) in visibleData" :key="index">{{ item }}</li>
    </ul>
  </uni-scroll-view>
</template>

<script>
export default {
  data() {
    return {
      // 总数据
      data: [],
      // 可视区域高度
      height: 0,
      // 可视区域顶部数据序号
      startIndex: 0,
      // 可视区域底部数据序号
      endIndex: 0,
      // 可视区域数据
      visibleData: []
    };
  },
  mounted() {
    // 初始化数据
    this.initData();
    // 监听可视区域高度变化
    uni.getSystemInfo({
      success: (res) => {
        this.height = res.windowHeight;
      }
    });
  },
  methods: {
    initData() {
      // 生成大量数据
      for (let i = 0; i < 10000; i++) {
        this.data.push(`数据 ${i+1}`);
      }
      // 初始化可视区域数据
      this.visibleData = this.data.slice(0, 30);
      this.endIndex = 29;
    },
    onScroll(e) {
      // 滚动事件
      const scrollTop = e.detail.scrollTop;
      const itemHeight = 50; // 每个数据项高度
      const visibleCount = Math.ceil(this.height / itemHeight); // 可见数据项个数
      const startIndex = Math.floor(scrollTop / itemHeight); // 开始渲染的数据序号

      if (startIndex !== this.startIndex) {
        this.startIndex = startIndex;
        this.endIndex = this.startIndex + visibleCount - 1;
        this.visibleData = this.data.slice(this.startIndex, this.endIndex + 1);
      }
    }
  }
}
</script>

这个示例代码中,我们使用了 uni-scroll-view 组件来包裹列表内容,并在 mounted 钩子函数中初始化了总数据和可视区域高度,并监听了滚动事件。
当用户滚动列表时,我们根据滚动距离和每个数据项的高度,计算出当前可视区域内应该显示的数据范围,并更新 visibleData 数组,并将其进行渲染。这样,只有可视区域内的数据才会被渲染,而不在可视区域内的数据则不会被渲染,从而大大减少了DOM操作次数,提高了渲染效率。

二、节流

除了使用虚拟列表来优化渲染效率外,我们还可以使用节流技术来控制函数的执行频率,从而避免频繁操作导致的页面卡顿问题。

在uniapp小程序中,我们可以利用Lodash库中的throttle方法来实现节流。首先,在需要使用节流的页面中安装Lodash库:

npm install lodash

然后,在vue文件中引入Lodash库中的throttle方法,并使用该方法对需要进行节流的函数进行包装:

<template>
  <view>
    <uni-virtual-list :list="list" :item-size="50" :keep-alive="10" class="list">
      <view slot="default" class="item">{{ item.text }}</view>
    </uni-virtual-list>
  </view>
</template>
<script>
import _ from 'lodash'

export default {
  data() {
    return {
      list: [
        { id: 1, text: 'item 1' },
        { id: 2, text: 'item 2' },
        ...
      ]
    }
  },
  created() {
    this.throttledScrollHandle = _.throttle(this.scrollHandle, 300)
  },
  methods: {
    scrollHandle() {
      // 处理滚动事件
    }
  },
  mounted() {
    uni.pageScrollTo({ scrollTop: 0 })
    uni.pageScrollTo({ scrollTop: 1000 })
    uni.$on('pageScroll', this.throttledScrollHandle)
  },
  destroyed() {
    uni.$off('pageScroll', this.throttledScrollHandle)
  }
}
</script>

通过以上代码,我们使用Lodash库中的throttle方法对scrollHandle函数进行包装,从而实现了对该函数的节流。在页面挂载时,我们还需要将scrollHandle函数绑定到页面滚动事件上,并设置一个间隔时间,以控制函数的执行频率。

三、上拉刷新和下拉加载

在虚拟列表和节流的基础上,我们可以实现上拉刷新和下拉加载功能。这时候,我们需要监听页面的滚动事件,当滚动到页面底部或顶部时,触发相应的操作。

具体实现如下:

<template>
  <view>
    <uni-virtual-list :list="list" :item-size="50" :keep-alive="10" class="list">
      <view slot="default" class="item">{{ item.text }}</view>
    </uni-virtual-list>
  </view>
</template>
<script>
import _ from 'lodash'

export default {
  data() {
    return {
      list: [
        { id: 1, text: 'item 1' },
        { id: 2, text: 'item 2' },
        ...
      ]
    }
  },
  created() {
    this.throttledScrollHandle = _.throttle(this.scrollHandle, 300)
  },
  methods: {
    scrollHandle(e) {
      const { scrollTop, scrollHeight, windowHeight } = e.detail
      if (scrollTop < 10) {
        // 上拉刷新
      } else if (scrollTop + windowHeight > scrollHeight - 10) {
        // 下拉加载
      }
    }
  },
  mounted() {
    uni.pageScrollTo({ scrollTop: 0 })
    uni.$on('pageScroll', this.throttledScrollHandle)
  },
  destroyed() {
    uni.$off('pageScroll', this.throttledScrollHandle)
  }
}
</script>

在上述代码中,我们使用页面滚动事件e.detail中的scrollTop、scrollHeight和windowHeight等属性计算出当前页面是否滚动到了底部或顶部,并触发相应的操作,从而实现了上拉刷新和下拉加载功能。

总结

综上所述,通过虚拟列表技术和节流技术的优化,我们可以实现uniapp小程序中的上拉刷新和下拉加载功能,并避免因大量数据渲染导致的页面卡顿问题,提升了页面的流畅性和稳定性。文章来源地址https://www.toymoban.com/news/detail-501559.html

到了这里,关于uniapp小程序如何通过虚拟列表配合节流,完成上拉刷新下拉加载,避免页面卡顿,提升性能呢?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序通过startLocationUpdate,onLocationChange获取当前地理位置信息,配合腾讯地图解析获取到地址

    先创建个getLocation.js文件 在App.vue文件里引入封装的getLocation.js文件 要在manifest.json文件里配置下内容

    2024年02月03日
    浏览(47)
  • 【uniapp小程序】打印列表UI模板

    这是一个云打印项目,首页查询接口渲染设备,设备是否在线是通过redis进行判断的,当设备在线时可以通过在线的驱动软件打印用户提交的文档,自动处理无需人工干预 今天主要是分享一下,文件列表界面,由于UI太丑于是我换了下,如图所示: 框架为uView2.0,代码如下:

    2024年02月11日
    浏览(35)
  • uniapp 微信小程序 城市索引列表

    最近做的一个项目需要频繁用到城市列表切换,切换城市,腾讯地图虽然有地图列表,但是效果不是自己项目想要的,于是就结合结合uview的IndexList 索引列表重新做了一个城市列表的页面 效果图:  页面结构:address.vue script代码: QQMapWX:腾讯地图sdk cityCode:城市列表处理的数

    2024年02月07日
    浏览(34)
  • 实现原生微信小程序虚拟列表

    小程序的setData每一次调用,都会重新和旧的虚拟dom进行diff对比,如果页面列表比较大的话,不断频繁加载setData,实际上是非常消耗性能的,所以也是为了解决这个考虑,我虽然每一次都在使用setData加载数据,但是setData加载完成的数据,我并不是直接渲染,而是通过wxml中微

    2024年02月11日
    浏览(43)
  • 如何通过OAuth2.0完成Microsoft平台登录验证

    参考内容: OAuth2 in Python | TestDriven.io 代表用户获取访问权限 - Microsoft Graph | Microsoft Learn OAuth 2.0 Bearer Token Usage 首先需要了解的是,通过Microsoft平台做身份验证,有一些配置时拿到的参数不可或缺(在身份验证的步骤中会用到,不一定是同一个步骤用到),其中包括: client_id:

    2024年02月09日
    浏览(33)
  • 如何重置Linux虚拟机的root密码?四步即可完成!

    第1步 重启系统,在下图所示界面按e键(在倒计时内完成) 第2步 找到linux这行,末尾空格后 输入 rd.break,输入完成后,按ctrl与x键同时按下。 第3步 按照下面图片所示输入代码,输入一行代码回车键一次,直至重置密码成功。(注意:提示输入密码时,你所输入的密码并不

    2024年02月13日
    浏览(37)
  • uniapp:聊天消息列表(好友列表+私人单聊)支持App、H5、小程序

          🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 目录  ⭐  文章简介(效果图展示)           📟 插件传送门:聊天消息列表  📘  文章背景

    2024年04月15日
    浏览(47)
  • 微信小程序瀑布流和虚拟列表

    首先声明虽然本篇是写的微信小程序的案例,但是也可用于H5,思路是想通的,只是有些api的差异,最后会贴代码片段 虚拟列表 一般在做长列表优化时,特别是面试时,虚拟列表就是个高频词。这个名词听起来很高级,其实原理很简单 虚拟列表就是将需要渲染的数组数据改

    2024年02月14日
    浏览(29)
  • uniapp 微信小程序 Picker下拉列表数据回显问题

    效果图: 1、template 2、data 3、methods

    2024年02月16日
    浏览(35)
  • 机器学习笔记 - 了解 GitHub Copilot 如何通过提供自动完成式建议来帮助您编码

            GitHub Copilot 是世界上第一个大规模 AI 开发人员工具,可以帮助您以更少的工作更快地编写代码。GitHub Copilot 从注释和代码中提取上下文,以立即建议单独的行和整个函数。         研究发现 GitHub Copilot 可以帮助开发人员更快地编码、专注于解决更大的问题、

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包