实现原生微信小程序虚拟列表

这篇具有很好参考价值的文章主要介绍了实现原生微信小程序虚拟列表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信虚拟列表

  1. 小程序的setData每一次调用,都会重新和旧的虚拟dom进行diff对比,如果页面列表比较大的话,不断频繁加载setData,实际上是非常消耗性能的,所以也是为了解决这个考虑,我虽然每一次都在使用setData加载数据,但是setData加载完成的数据,我并不是直接渲染,而是通过wxml中微信小程序提供的脚本wxs进行逻辑的截取,我把截取下来的数据进行视图渲染,我会在以下讲解我实现的思路;
  2. 第一我是通过微信小程序提供动态获取屏幕宽高的wx.getSystemInfoSync().screenHeight拿到高度,这样我在和每一个渲染的列表高度进行计算,动态拿到了可视区域内可以渲染的节点,这样的话,每一次我只要动态截取可容纳可视区域渲染的这些元素节点来渲染就可以大大的保证性能了;
  3. 将微信小程序中的rpx转换成为px,因为我在实现页面布局的时候是rpx,所以我在获取正确列表正确高度的时候肯定是rpx;
  4. 通过可视区域计算出列表的开始索引startIndex和可视区域结束的索引endIndex;
  5. 在页面脚本截取数据并且直接渲染页面;
  6. 对可视区域上层和可视区域下层的数据进行padding留白;
  7. 监听scroll-view组件的触底事件,对页面进行上拉加载,这里我没有实现下拉刷新,因为我个人觉得每一次数据加载最多也就是30条,数据量不大呀,对页面造成不了多大的渲染影响,这样也就没有必要实现下拉刷新;
  8. 因为我对可视区域上层和下层都加了空白,在页面滚动快的时候,会出现大量的空白,这种行为如果用户看到了,肯定觉得页面卡死了,体验非常的差,所以我扩大了截取数据的范围,原先我只截取可视区域的数据来渲染,现在不是,我还向上还多截取了一个可视区域的数据,向下也多截取了一个可视区域的数据,这样在页面不管是向上还是向下滚动的时候,就因为我截取的范围大而不会出现大量的空白了

虚拟列表组件视图层

  1. 虚拟列表视图层;
<wxs module="m1">
    var index = 0;
    var sliceIndex = 0;
    // 截取最后一个索引
    var endIndex = function (list, startIndex, size) {
        var idx = startIndex + size * 2;
        if (!list[idx]) {
            idx = list.length - 1;
        }
        index = idx;
        return idx;
    }
    // 截取渲染数组列表
    var showDataList = function (list, startIndex, size) {
        var start = 0;
        if (startIndex <= size) {
            start = 0;
        } else {
            start = startIndex - size;
        }
        return list.slice(start, index);
    }
    // 可视区渲染区域上层paddingTop会被填充空白
    var topBlack = function (startIndex, itemHeight, size) {
        var start = 0;
        if (startIndex <= size) {
            start = 0;
        } else {
            start = startIndex - size;
        }
        return start * itemHeight;
    }
    // 可视区渲染区域层下层paddingBottom会被填充空白
    var bootomBlack = function (list, itemHeight) {
        return (list.length - index) * itemHeight
    }
    module.exports = {
        showDataList: showDataList,
        topBlack: topBlack,
        bootomBlack: bootomBlack,
        endIndex: endIndex
    };
</wxs>


<view class="news-box">
    <scroll-view scroll-y="true" class="scroll-container" bindscroll="handlerScroll" bindscrolltolower="scrolltolower">
        <!-- 执行这个脚本获取到最新截取的最后索引 -->
        <view hidden="{
    {true}}">{
  {m1.endIndex(list,startIndex,size)}}</view>
        <!-- 向上1个可视区外被paddingTop撑满,向下1个可视区外被paddingBottom撑满 -->
        <view style="padding-top: {
       {
       m1.topBlack(startIndex,itemHeight,size)}}px;padding-bottom: {
       {
       m1.bootomBlack(list,itemHeight)}}px;">
            <!-- 渲染的列表 -->
            <view wx:for="{
    {m1.showDataList(list,startIndex,size)}}" wx:key="index">
                <navigator url="/pages/aticle/aticle

文章来源地址https://www.toymoban.com/news/detail-501885.html

到了这里,关于实现原生微信小程序虚拟列表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 微信小程序(原生)搜索功能实现

     一、效果图  二、代码 wxml scss js json文件是引入的vant

    2024年02月11日
    浏览(39)
  • 【微信小程序】列表滚动触底更新实现

    微信小程序开发系列 在微信小程序开发中经常遇到分页列表需要滚动到底部之后进行请求数据更新,下面介绍如何进行触底更新分页展示。使用到页面上拉触底事件的处理函数 onReachBottom 。 监听用户上拉触底事件,可以在app.json的window选项中或页面配置中设置触发距离onRea

    2024年02月05日
    浏览(26)
  • 微信小程序实现tab切换和数据列表

    上篇文章介绍了微信小程序实现tab切换的一种方案(参考 https://blog.51cto.com/baorant24/6188157 ),感觉代码不是很精简,本文再用一个demo介绍微信小程序如何实现tab切换和数据列表。 微信小程序对应页面文件结构如下: 话不多说,直接上代码: (1)index.js文件,代码如下: (2)index.

    2024年02月05日
    浏览(32)
  • 原生微信小程序实现手写签名功能

    项目中有遇到在小程序上实现手动签名功能,今天给大家分享下代码 wxml 文件代码如下,catchtouchmove属性一定要加上,否则移动起来连笔非常不流畅 wxss代码 js代码 效果如下

    2024年02月16日
    浏览(35)
  • 原生微信小程序实现弹出层效果

    WXML JS WXSS 效果图

    2024年02月16日
    浏览(40)
  • 原生微信小程序,多音频播放实现进度条功能

    小程序的音频组件没有进度条的功能,业务需要,只好烧脑自己实现。 逻辑思路: 1.所有音频播放、停止按钮使用状态切换控制 2.当点击某个音频播放时,首先将所有音频的状态置为停止状态,然后将当前音频置为播放状态 3.滚动条插件配合音频控件一起使用 4.播放状态时滚

    2024年02月11日
    浏览(48)
  • 微信小程序原生开发功能合集十六:系统主页实现

      本章实现小程序主页开发及对应逻辑处理,实现问卷填报相关功能,实现问卷查看、问卷查看、填报历史等功能的实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:   

    2024年02月10日
    浏览(32)
  • 黑马微信小程序-实现本地服务九宫格并展示商品列表

    1.1准备接口 黑马接口:https://applet-base-api-t.itheima.net/categories 说明:这是获取九宫格的数据接口 1.2使用接口  说明:声明变量获取数据。  res.data数据 编写简单css 实图展示      声明query变量  并设置导航标题 标题展示      2.1准备接口 商品列表接口:https://applet-base-api-t

    2024年02月11日
    浏览(46)
  • 微信小程序原生使用map组件实现轨迹、多边形

    使用地图本身的map组件实现地图 初始化地图: map组件的属性 longitude 必须 Number 中心点经度 latitude 必须 Number 中心点纬度 scale 选填 Number 地图的缩放级别(缩放切换时使用) include-points 选填 Array. 缩放视野以展示所有坐标点 markers 选填 Array. 地图展示的坐标点集合 polyline 选填

    2024年02月03日
    浏览(32)
  • 微信小程序原生开发功能合集十二:编辑界面的实现

      本章实现编辑界面的实现处理,包括各编辑组件的使用及添加数据保存数据流程的实现处理。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.ne

    2024年02月02日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包