首页 > 编程语言 >微信小程序 触底加载更新 虚拟列表渲染

微信小程序 触底加载更新 虚拟列表渲染

时间:2024-10-18 15:11:41浏览次数:6  
标签:index pageHeight idx 渲染 ++ 微信 let currentIndex 加载

  <wxs module='filter'>
  var includesList = function(list,currentIndex){
    if(list){
      return list.indexOf(currentIndex) > -1
    }
  }
  module.exports.includesList =  includesList;
  </wxs>
  <scroll-view  style='height: 76vh;' 
    scroll-y="true" 
    bindscrolltolower="loadMore"
    bindscroll="scrollFn"
  >   
  <view class="template_container">
    <view wx:for="{{list}}" wx:for-index="pageNum" id="item{{pageNum}}" wx:key="pageNum">
    <block wx:if="{{filter.includesList(visualIndex,pageNum)}}">
      <view class="item-list" wx:for="{{item}}" wx:key="item">
        <text class="">{{item.idx}}</text>
      </view>
    </block>
    <block wx:else>
      <view class="item-visible" style="height:{{pageHeight[pageNum]}}px"></view>
    </block>
  </view>
</view>
</scroll-view>  
// pages/commodity/index.js
import { throttle } from './utils'
Page({

  /**
   * 页面的初始数据
   */
  data: {
    list: [],          // 所有数据
    visualIndex: [0],          //  展示区域
    pageHeight: [],
    scrollTop: 5, // 设定触发条件的距离
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onl oad(options) {
    this.setData({ tabBarList: app.globalData.tabBarList });

    this.index = 0;
    this.currentIndex = 0;           // 当前页数 pageNum
    this.pageHeight = [];            // 每屏高度存储
    this.allList = [];               // 获取到的所有数据
    this.systemHeight = 0;           // 屏幕高度
    this.visualIndex = [];           // 存储可视区域pageNum
    const arr = [
      { idx: this.index++ },
      { idx: this.index++ },
      { idx: this.index++ },
      { idx: this.index++ },
      { idx: this.index++ },
    ]
    this.setData({ [`list[${this.currentIndex}]`]: arr }, () => {
      this.setPageHeight();
    });
    this.getSystemInfo();
  },
  // 获取屏幕高度
  getSystemInfo() {

    wx.getSystemInfo({
      success: (res) => {
        let { windowHeight } = res;
        this.systemHeight = windowHeight;
      }
    })
  },
  // 获取每屏高度
  setPageHeight() {
    setTimeout(() => {
      wx.nextTick(() => {
        let that = this;
        let currentIndex = this.currentIndex;
        let query = wx.createSelectorQuery();
        query.select(`#item${currentIndex}`).boundingClientRect()
        query.exec(function (res) {
          that.pageHeight[currentIndex] = res[0] && res[0].height;
          that.setData({
            pageHeight: that.pageHeight
          })
        })
      })
    }, 100);
  },
  loadMore: function () {
    this.currentIndex++;            // 触底+1
    const arr = [
      { idx: this.index++ },
      { idx: this.index++ },
      { idx: this.index++ },
      { idx: this.index++ },
      { idx: this.index++ },
    ]
    this.setData({ [`list[${this.currentIndex}]`]: arr }, () => {
      this.setPageHeight()
    })
  },
  // 滚动距离计算
  scrollFn: throttle(function (e) {
    let pageScrollTop = e[0].detail.scrollTop;
    let that = this;
    // 滚动计算现在处于那一个分页的屏
    let scrollTop = 0;
    for (var i = 0; i < this.pageHeight.length; i++) {
      scrollTop = scrollTop + this.pageHeight[i];
      if (scrollTop > pageScrollTop + this.systemHeight - 50) {
        this.currentIndex = i;
        this.visualIndex = [i - 1, i, i + 1];
        that.setData({
          visualIndex: this.visualIndex
        })
        break;
      }
    }
  }, 200)
})
const throttle = (fn, interval) => {
  var enterTime = 0; //触发的时间
  var gapTime = interval || 300; //间隔时间,如果interval不传值,默认为300ms
  return function () {
    var that = this;
    var backTime = new Date(); //第一次函数return即触发的时间
    if (backTime - enterTime > gapTime) {
      fn.call(that, arguments);
      enterTime = backTime; //赋值给第一次触发的时间 保存第二次触发时间
    }
  };
}

module.exports = {
  throttle
}

 

标签:index,pageHeight,idx,渲染,++,微信,let,currentIndex,加载
From: https://www.cnblogs.com/zxh-bug/p/18474346

相关文章

  • javascript渲染OFD的库
    目前使用javascript开发的OFD的渲染库主要有两个:ofd.js和liteofd,其中ofd.js开发比较早,liteofd是最近刚出现的js库。首先结论是ofd.js渲染效果没有liteofd好,因为ofd.js目前有一些效果没有支持,比如对字体没有比较好的解析和支持。liteofd相对ofd.js效果更好,并且提供的接口方法更多......
  • python+flask框架的高校计算机服务微信小程序设计与开发小程序18(开题+程序+论文) 计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的迅猛发展,微信小程序作为一种轻量级的应用形式,已广泛应用于各行各业。高校作为教育和科研的重要场所,其计算机服务需求......
  • uniapp开发微信小程序之搜索联想、高亮显示(附demo)
    小程序比较常见的功能就是搜索,搜索的一个体验点就联想、高亮显示,惯例还是先看效果。实现效果实现思路1)uni-search-bar搜索框,监听input事件,触发搜索联想2)调用后台接口,根据分词查询数据(TopN),返回前端数据3)前端利用正则表达式,匹配数据中的分词,添加高亮样式4)v-html标......
  • 免费送源码:Javat微信小程序 基于springboot高校教学评价平台 计算机毕业设计原创定制
    摘 要随着中国经济的飞速增长,消费者的智能化水平不断提高,许多智能手机和相关的软件正在得到更多的关注和支持。其中,微信小程序的高校教学评价平台更是深得消费者的喜爱,它的出现极大地改善了消费者的生活质量,同时,它还创造了一种快捷、有效的数据信息管理网络平台,让消费者更......
  • Vue3 - 详细实现移动端H5网页调用摄像头拍照功能,微信公众号网页h5页面打开本地摄像头
    前言PC网站端,请访问这篇文章。在vue3手机移动端开发中,详解H5页面/微信公众号网页调用浏览器摄像头并拍照完整示例,在手机浏览器上开启摄像头并拍照上传服务器或保存到本地功能(实时预览使用图片临时路径或base64数据),切换转换前置摄像头与后置摄像头,vue3手机H5打开摄像......
  • 配置式表单渲染器的实现
    配置式表单渲染器的实现 我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。本文作者:奇铭(掘金)需求背景前段时间,离线计算产品接到改造数据同步表单的需求。一方面,数据同步模块的代码可读......
  • Stats渲染数据统计窗口
    Statistics窗口,全称叫做RenderingStatisticsWindow,即渲染统计窗口(或渲染数据统计窗口),窗口中罗列出关于渲染、声音、网络状况等多种统计信息,下面详细的解释一下这些项的意义。FPS(TimeperframeandFPS)framesperseconds表示引擎处理和渲染一个游戏帧所花费的时间,该数字主......
  • 基于微信平台的房屋租赁公司电费管理系统 (案例分析)-附源码
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,房屋租赁公司电费管理系统被用户普遍使用,为方便用户能够可以随时进行房屋租赁公司电费的数据信息管理,特开发了基于微信平......
  • 微信小程序的校园二手物品交易平台设计与实现
    文章目录前言......
  • 麻将计分器微信小程序的开发
    前言最近朋友推荐了一个计分的小程序,但是这个小程序不仅打开有广告,各个页面都植入了广告,用起来十分不适。于是我就心里暗自下定决心,一定要撸一个没有广告的小程序。一周后,这个小程序发布了。欢迎大家参观和使用我的小程序!小程序名称:MahjongScorer思路1.注册,获取头像和昵称。......