微信小程序的无限瀑布流写法

news2024/12/23 17:09:38

微信小程序的无限瀑布流实现总算做完了,换了好几种方法,过程中出现了各种BUG。

首先官方有瀑布流的插件(Skyline /grid-view),不是原生的我就不想引入,因为我的方块流页面已经搭好了,引入说不定就要涉及样式的修改、代码量的增大等麻烦问题。

H5我虽然也做了瀑布流,但是是用绝对定位来做的,性能消耗有点大。所以小程序这边就是想把原本flex固定宽高的改成两列。(纯CSS就不要想了,根本不可能实现,虽然也查到了新的css瀑布流规则,但绝大部分浏览器不支持也是白搭。)

方案一:

    const query = wx.createSelectorQuery().in(this);
    query.select(`.desc-${index}`).boundingClientRect((res) => {
    }).exec();

原本显示的数据先做隐藏,之后利用boundingClientRect来获取隐藏块的高度,再计算对比高度看应该放入list1还是list2中。

这样做会出现两个问题,第一,新增列会明显抖动,因为image我用了mode="widthFix",加载页面跳一下还好,无限瀑布流是要一直可以下拉加载的,就会导致每次新图出来都要跳一下,体验很差……

即使第一个问题我可以缓存高度,替换为aspectFill解决。但第二个问题是,它加载越多,异步延迟就越大,会导致后面的高度根本获取不到而无法正常排版(大概超过80条左右?)……

方案二:

使用wx.getImageInfo来代替获取图片高度,但这样会出现一个明显的问题,就是每次图片的请求是翻倍的,图片本身就加载请求了一次,现在还多用接口请求了一次,这样做太消耗性能了……

另外要注意的是,我的文字其实也是不定高度的,所以不能只对比图片,还得把图片以外的因素都加进来才行。

方案三:

隐藏块使用bindload获取图片高度。这样既避免了方案一中后续获取不到高度,又使得图片不需要二次请求。于是顺着这个思路走,最终解决了这个浪费了我整整一天工作日的瀑布流问题。

index.wxml

<template name="card">
  <navigator class="recommend-card" url="/pages/trade/detail/index?id={{item.id}}">
      <view class="recommend-top">
        <image wx:if="{{item.height}}"
          class="recommend-img"
          src="{{ item.pic }}"
          mode="aspectFill"
          style="height: {{item.height}}rpx;" />
        <image wx:else
          class="recommend-img"
          src="{{ item.pic }}"
          data-index="{{index}}"
          bindload="imgLoad"
          data-title="{{item.title}}"
          mode="widthFix" />
      </view>
      <view class="aui-padded-10 recommend-bottom">
        <view class="aui-font-size-14 recommend-title">{{item.title}}</view>
        <view class="aui-font-size-12 c9 recommend-position">
          <image alt="地点" class="position-img" src="{{locUrl}}/svg/trade-position.svg" />
          <view class="no-wrap">{{item.province}} {{item.city}}</view>
        </view>
      </view>
  </navigator>
</template>
<view class="recommend-list">
  <template is="card" wx:for="{{tradeList}}" wx:key="index" data="{{item, locUrl, index}}"></template>
</view>
<view class="flex-b">
  <view>
    <template is="card" wx:for="{{list1}}" wx:key="index" data="{{item, locUrl, index}}"></template>
  </view>
  <view>
    <template is="card" wx:for="{{list2}}" wx:key="index" data="{{item, locUrl, index}}"></template>
  </view>
</view>

index.js

import { dealTradePic } from "~/utils/trade";

Component({
  options: {
    addGlobalClass: true,
  },

  properties: {
    goodsList: {
      type: Array,
      value: [],
      observer(goodsList) {
        const tradeList = dealTradePic(goodsList);
        const obj = { tradeList };
        if (tradeList.length === 10) {
          // 因为没有置0处理,重新加载时前10条不会触发onload
          const { list1, list2, bufferH1, bufferH2 } = this.data;
          obj.list1 = list1.slice(0, 10);
          obj.list2 = list2.slice(0, 10);
          obj.h1 = bufferH1;
          obj.h2 = bufferH2;
        }
        this.setData(obj);
      },
    }
  },

  data: {
    locUrl: getApp().locUrl,
    tradeList: [],
    h1: 0,
    h2: 0,
    bufferH1: 0,
    bufferH2: 0,
    list1: [],
    list2: [],
    count: 0,
  },

  methods: {
    imgLoad(e) {
      const { width, height } = e.detail;
      const { index, title } = e.currentTarget.dataset;
      const { tradeList, list1, list2, h1, h2 } = this.data;
      // 高度比例切换
      let h = 340 * height / width;
      h = h > 480 ? 480 : h;
      tradeList[index].height = h;
      // 增加文字与其他高度
      const word = title.replace(/[^\x00-\xff]/g, "aa").length;
      const wh = parseFloat((h + (word > 22 ? 38 : 0)).toFixed(2)) + 150;
      if (h1 <= h2) {
        list1.push(tradeList[index]);
        this.data.h1 = parseFloat(h1.toFixed(2)) + wh;
      } else {
        list2.push(tradeList[index]);
        this.data.h2 = parseFloat(h2.toFixed(2)) + wh;
      }
      // 初始高度记录,用于清空
      this.data.count++;
      if (this.data.count === 10) {
        this.data.bufferH1 = this.data.h1;
        this.data.bufferH2 = this.data.h2;
      }
      this.setData({ list1, list2 });
    }
  }
});

index.wxss

.recommend-list {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  padding: 0;
  height: 0;
  overflow: hidden;
}

.recommend-card {
  box-sizing: border-box;
  font-size: 24rpx;
  border-bottom: none;
  width: 342rpx;
  margin-bottom: var(--gap);
}

.recommend-top {
  width: 340rpx;
}

.recommend-img {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 16rpx 16rpx 0 0;
  overflow: hidden;
}

.recommend-title {
  font-size: 28rpx;
  overflow: hidden;
  -o-text-overflow: ellipsis;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.recommend-position {
  display: flex;
  align-items: center;
  margin-top: 12rpx;
}

.recommend-bottom {
  background-color: white;
  border-radius: 0 0 16rpx 16rpx;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时空智友企业流程化管控系统任意文件上传漏洞复现【附POC】

文章目录 时空智友企业流程化管控系统任意文件上传漏洞复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现4.访问shell地址 0x06 修复建议 时空智友企业流程化管控系统任意文件上传漏洞复现 0x01 前言 免责声明&#xff1a;请…

股票难还是期货难?国内玩期货的人多吗?

股票和期货都是相对较难的金融投资工具。它们都有各自的优点和挑战&#xff0c;而且都需要深入了解市场、制定策略和进行风险管理。 就难度而言&#xff0c;期货和股票的难度主要在于以下方面&#xff1a; 1. 市场风险&#xff1a;股票和期货市场都存在风险&#xff0c;包括价格…

【沐风老师】3DMAX翻转折叠动画插件FoldFx使用方法详解

3DMAX翻转折叠动画插件FoldFx使用方法详解 3DMAX翻转折叠动画插件FoldFx&#xff0c;是3dMax运动图形工具&#xff0c;用于创建多边形折叠动画。用户几乎有无限的可能性&#xff0c;因为动画的每个方面都是可控的。 【适用版本】 适用于3dMax版本&#xff1a;2010及更新版本&a…

QT6.5.2编译PostgreSql驱动

一、环境 1、操作系统&#xff1a;win11 2、qt版本&#xff1a;6.5.2 3、PostgreSql版本:14.9 二、下载qbase源码 1、下载地址&#xff1a;https://github.com/qt/qtbase/tree/6.5.2 将下载的源码文件解压指定的的目录&#xff0c;找到src/plugins/sqldrivers根据自己的实…

基于springboot+vue的校园资产管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

小皮面板配置Xdebug,调试单个php文件

小皮面板配置Xdebug 首先下载phpstrom&#xff0c;和小皮面板 打开小皮面板&#xff0c;选中好要使用的php版本 然后点击【管理】> 【php扩展】> 【xdebug】 然后打开选中好版本的php位置 D:\Program_Files\phpstudy_pro\Extensions\php\php7.4.3nts打开php.ini文件…

[0CTF 2016]piapiapia 代码审计 字符串逃逸 绕过长度限制

第一次直接打包代码 然后查看有没有洞 学习一下 降低速度扫描dirsearch -t 2 超低速 扫描扫到了 /www.zip /profile.php /register.php /upload/ 未加参数 我们直接去看看 我们直接下载备份文件即可 config.php 存在flag变量 class.php 然后我们分析一下class.php &…

Visual Studio 2019 C# winform CefSharp 中播放视频及全屏播放

VS C# winform CefSharp 浏览器控件&#xff0c;默认不支持视频播放&#xff0c;好在有大佬魔改了dll&#xff0c;支持流媒体视频播放。虽然找了很久&#xff0c;好歹还是找到了一个版本100.0.230的dll&#xff08;资源放在文末&#xff09; 首先创建一个项目 第二、引入CefSha…

VMware安装debian11虚拟机详细步骤

VMware安装debian11虚拟机详细步骤&#xff0c;超详细&#xff0c;一次搞定。 目录 1&#xff0c;新建虚拟机 2&#xff0c;开始安装 3&#xff0c;磁盘分区&#xff08;手动&#xff09; 分区设置 配置LVM卷 4&#xff0c;软件包管理器、网络镜像等 5&#xff0c;完成安…

UOS 序列号激活指令及方法

前言&#xff1a;本方案主要介绍了6种不同的激活方式&#xff0c;包括 1、在线激活&#xff1b; 2、离线激活&#xff1b; 3、激活文件激活&#xff1b; 4、终端命令激活&#xff1b; 5、试用期激活&#xff1b; 6、测试激活码激活。 附&#xff1a;激活码正版验证网页&#xf…

Fedora Linux 39 Beta 预估 10 月底发布正式版

Fedora 39 Beta 镜像于今天发布&#xff0c;用户可以根据自己的使用偏好&#xff0c;下载 KDE Plasma&#xff0c;Xfce 和 Cinnamon 等不同桌面环境版本&#xff0c;正式版预估将于 10 月底发布 Fedora 39 Beta 版本主要更新了 DNF 软件包管理器&#xff0c;并优化了 Anaconda …

kotlin的集合使用maxBy函数报NoSuchElementException

kotlin设定函数 fun test() {listOf<Int>().maxBy { it } } 查看java实现

Vue+iview 组件中通过v-for循环动态生成form表单进行表单校验

在做项目时&#xff0c;需要根据需要动态添加或新增表单&#xff0c;同时还需要对表单做校验。详情如下图&#xff1a; 刚开始做表单验证的时候&#xff0c;对于这个动态的表单验证有点难搞&#xff0c;试了好几种方法都没有搞定。最后按照下面这种方法实现了&#xff0c;以此…

Express 基础操作和详解

Express 基础操作和详解 Express.js 是一个基于 Node.js 平台的 Web 应用程序框架&#xff0c;它旨在帮助开发者轻松构建和管理 Web 服务和应用程序。Express 提供了许多强大的功能&#xff0c;使得创建可扩展、灵活且高性能的 Web 应用变得相对容易。以下是 Express 的主要特点…

Github 开启 2FA-无需下载软件实现

Github 开启 2FA 验证了&#xff0c;如果不配置&#xff0c;后续会限制登录Github, 用代码实现配置 获取密钥 setup key 点击 setup key 链接&#xff0c;获取密钥 引入相关算法的 jar <dependency><groupId>com.amdelamar</groupId><artifactId>jot…

华为存储培训

01 存储前沿技术和发展趋势 狭义的存储定义 CD、DVD、ZIP、磁带、硬盘等 广义的存储定义 存储硬件系统&#xff08;磁盘阵列&#xff0c;控制器&#xff0c;磁盘柜&#xff0c;磁带库等&#xff09; 存储软件&#xff08;备份软件&#xff1b;管理软件&#xff0c;快照&…

Eclipse初步学习使用

1.配置自动填充 window->preference 2.自动判断错误&#xff0c;并给出解决方法 3.创建可执行文件&#xff1a; 新建package&#xff0c; 包内新建 javaclass&#xff0c;选择psvm&#xff0c; 4.编写程序&#xff0c;进行执行 右键&#xff0c;选择 run as applic…

第二证券:持股还是持币?多家券商:四季度行情有望回归

上星期初&#xff0c;海外商场持续调整&#xff0c;中美利差继续探底&#xff0c;一度压制A股体现。然而上星期五方针预期提振、AI权重股开释利好、外资大幅回流&#xff0c;共同引领A股走出一波触底反弹的独立行情。展望本周&#xff0c;A股将迎来中秋国庆长假前的最终一个买卖…

深度强化学习(一)常识性普及

文章目录 机器学习、强化学习、深度学习的侧重点强化学习的简介强化学习的主要特征强化学习和机器学习的关系强化学习的发展历史 深度强化学习 一些参考的资料&#xff1a; 蘑菇书&#xff1a;https://datawhalechina.github.io/easy-rl/#/chapter1/chapter1 源代码&#xff1a…

Pycharm2023版修改镜像源

步骤1 步骤2 国内常见镜像源 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣(douban) http://pypi.douban.com/simple/清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/中国科学技术大学 http://pypi.mirrors.…