uniapp 瀑布流 (APP+H5+微信小程序)
WaterfallsFlow.vue
<template><view class="wf-page" :class="props?.paddingC ? 'paddingC' : ''"><!-- left --><view><view id="left" ref="left" v-if="leftList.length"><viewv-for="(item, index) in leftList":key="index"class="wf-item"@tap="itemTap(item)"><!-- #ifdef MP-WEIXIN -->//这里需要注意插槽id 必须是唯一id ,否则小程序显示异常<slot :name="`slot${item.customSId || item.id}`"></slot><!-- #endif --><!-- #ifndef MP-WEIXIN --><slot :item="item" :index="index"></slot><!-- #endif --><!-- <slot :item="item" :index="index"></slot> --></view></view></view><!-- right --><view><view id="right" ref="right" v-if="rightList.length"><viewv-for="(item, index) in rightList":key="index"class="wf-item"@tap="itemTap(item)"><!-- #ifdef MP-WEIXIN -->//这里需要注意插槽id 必须是唯一id ,否则小程序显示异常<slot :name="`slot${item.customSId || item.id}`"></slot><!-- #endif --><!-- #ifndef MP-WEIXIN --><slot :item="item" :index="index"></slot><!-- #endif --></view></view></view></view>
</template><script lang="ts" setup>
// import App from "@/script/module/App.js";
import { axj } from "@/script/sdk/cloudfarm";
import {reactive,ref,onMounted,watch,nextTick,getCurrentInstance,
} from "vue";
import { onPageScroll, onShow, onPullDownRefresh } from "@dcloudio/uni-app";
import App from "@/script/module/App";
const props: any = defineProps({// 瀑布流列表wfList: {type: Array,require: true,},updateNum: {type: Number,default: 10,},updated: {//强制页面重新渲染type: Boolean,default: false,},paddingC: {//控制显示paddding 兼容之前瀑布流样式type: Boolean,default: false,},
});
const _this = getCurrentInstance();
let allList = ref([]);
let leftList = ref([]);
let rightList = ref([]);
let boxHeight = ref([]);
let mark = ref(0);
// 调用父组件
const emits = defineEmits(["itemTap", "notify"]);// 瀑布流排序
const waterFall = () => {const i = mark.value;if (i === 0) {// 初始化,从左边开始插入leftList.value.push(allList.value[i]);// 更新左边列表高度nextTick(() => {getViewHeight(0);});} else if (i === 1) {// 第二个item插入,默认为右边插入rightList.value.push(allList.value[i]);// 更新右边列表高度nextTick(() => {getViewHeight(1);});} else {// 根据左右列表高度判断下一个item应该插入哪边const leftOrRight = boxHeight.value[0] >= boxHeight.value[1] ? 1 : 0;if (leftOrRight) {rightList.value.push(allList.value[i]);} else {leftList.value.push(allList.value[i]);}// 更新插入列表高度 setTimeout用来解决 多次数据push 计算高度错误问题setTimeout(() => {getViewHeight(leftOrRight);}, 0);}
};
// 获取列表高度
const getViewHeight = (leftOrRight) => {const query = uni.createSelectorQuery().in(this || _this);const id = leftOrRight ? "#right" : "#left";// 使用nextTick,确保页面更新结束后,再请求高度nextTick(() => {query.select(id).boundingClientRect((res: any) => {res ? (boxHeight.value[leftOrRight] = res.height) : "";mark.value = mark.value + 1;}).exec();});
};
// item点击
const itemTap = (item) => {emits("itemTap", item);
};const setWfList = (wfList) => {allList.value = wfList;waterFall();
};let collect = () => {let requestParm = {topicModule: props?.topicModule,topicId: props?.topicId,};return new Promise((resolve, reject) => {App.client?.farm.Api_UserInteract.thumb(0, [requestParm], (err, res) => {if (res) {resolve(true);}});});
};watch(() => props.wfList,() => {// 如果数据为空或新的列表数据少于旧的列表数据(通常为下拉刷新或切换排序或使用筛选器),初始化变量if (!props.wfList.length ||(props.wfList.length === props.updateNum &&props.wfList.length <= allList.value.length) ||props.updated) {allList.value = [];leftList.value = [];rightList.value = [];boxHeight.value = [];mark.value = 0;}// 如果列表有值,调用waterfall方法if (props.wfList.length) {allList.value = props.wfList;waterFall();}},{immediate: true, // 初始化数据触发watch// deep: true, // 对 对象进行深度监听 ; 此处深度监听,如果数据改变(比如点赞)会导致页面重绘}
);
watch(() => mark.value,() => {const len = allList.value.length;if (mark.value < len && mark.value !== 0) {waterFall();} else {if (boxHeight.value.length >= 2) {let bHeight =boxHeight.value[0] > boxHeight.value[1]? boxHeight.value[0]: boxHeight.value[1];emits("notify", bHeight);}}},{immediate: true, // 初始化数据触发watchdeep: true, // 对 对象进行深度监听}
);
</script><style lang="scss" scoped>
$page-padding: 10px;
$grid-gap: 10px;
.wf-page {display: grid;grid-template-columns: 1fr 1fr;grid-gap: $grid-gap;// padding: 10px $page-padding;
}
.paddingC {padding: 10px $page-padding;
}
.wf-item {width: calc((100vw - 2 * #{$page-padding} - #{$grid-gap}) / 2);padding-bottom: $grid-gap;
}
</style>
waterfall.vue
//这里需要注意customSId 必须是唯一id ,否则小程序显示异常
<template><WaterfallsFlow ref="wfListRef" :wfList="DataList" :updated="updated"><!-- #ifdef MP-WEIXIN --><viewclass="item"v-for="(item, index) in DataList":key="index":slot="`slot${item.customSId}`">//这里自己写插槽内容<view :item="item" ></view></view><!-- #endif --><!-- #ifndef MP-WEIXIN --><template v-slot="{ item }"><view class="item">//这里自己写插槽内容<view :item="item" ></view></view></template><!-- #endif --></WaterfallsFlow>
</template><script lang="ts" setup >
import { reactive, ref, onMounted, watch } from "vue";
import { onPageScroll, onShow, onPullDownRefresh } from "@dcloudio/uni-app";
import WaterfallsFlow from "./WaterfallsFlow.vue";
const DataList = ref([{image:"https://ss.dev.yiyiny.com/digital/2023/04/25/00yqnc0wglmzhtqf.jpg?x-oss-process=image/quality,q_50",avatar:"https://cdn.pixabay.com/user/2015/10/12/02-06-28-605_250x250.jpg",nickName: 1,title:"非常好看的额图片,快起来这里买看的额图片,快起来这里买看的额图片,快起来这里买看的额图片,快起来这里买东西",isLike: true,},{image:"https://ss.dev.yiyiny.com/digital/2023/04/24/009vus6uglv9477m.jpeg?x-oss-process=image/quality,q_5",avatar:"https://cdn.pixabay.com/user/2015/10/12/02-06-28-605_250x250.jpg",nickName: 2,title: "这段文字要少",isLike: false,},];)
</script><style scoped lang="scss">
</style>相关文章:
uniapp 瀑布流 (APP+H5+微信小程序)
WaterfallsFlow.vue <template><view class"wf-page" :class"props?.paddingC ? paddingC : "><!-- left --><view><view id"left" ref"left" v-if"leftList.length"><viewv-for…...
医疗小程序:提升服务质量与效率的智能平台
在医疗行业,公司小程序成为提高服务质量、优化管理流程的重要工具。通过医疗小程序,可以方便医疗机构进行信息传播、企业展示等作用,医疗机构也可以医疗小程序提供更便捷的预约服务,优化患者体验。 医疗小程序的好处 提升服务质量…...
ComPDFKit 转档SDK OCR表格识别功能
我们非常高兴地宣布,适用于 Windows、iOS、Android 和服务器的 ComPDFKit 转档SDK 1.8.0 现已发布!在该版本中,OCR 功能支持了表格识别,优化了OCR文字识别率。PDF to HTML 优化了html 文件结构,使转换后的 HTML 文件容…...
华为OD机考--阿里巴巴黄金箱
题目内容 贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子每个箱子上面贴有一个数字箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字之和; 一个箱子左边部分…...
mybatis-config.xml-配置文件详解
文章目录 mybatis-config.xml-配置文件详解说明文档地址:配置文件属性解析properties 属性应用实例 settings 全局参数定义应用实例 typeAliases 别名处理器举例说明 typeHandlers 类型处理器environments 环境environment 属性应用实例 mappers配置 mybatis-config.xml-配置文…...
【雕爷学编程】MicroPython动手做(18)——掌控板之声光传感器
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
Ribbon源码
学了feign源码之后感觉,这部分还是按运行流程分块学合适。核心组件什么的,当专业术语学妥了。序章:认识真正のRibbon 但只用认识一点点 之前我们学习Ribbon的简单使用时,都是集成了Eureka-client或者Feign等组件,甚至在…...
Linux下在终端输入密码隐藏方法
Linux系统中,如何将在终端输入密码时将密码隐藏? 最近做简单的登录界面时,不做任何操作的话,在终端输入密码的同时也会显示输入的密码是什么,这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符*隐藏起来…...
【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】
文章目录 ARM64 无符号位域提取指令 上篇文章:ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP 下篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 ARM64 无符号位域提取指令 在代码中如何监控寄存器的某1bit, 或者某几…...
求分享如何批量压缩视频的容量的方法
视频内存过大,不但特别占内存,而且还会使手机电脑出现卡顿的现象,除此之外,如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此,我们可以批量地压缩视频文件的内存大小,今天小编要来分享一招&a…...
ChatGPT 是如何工作的:从预训练到 RLHF
欢迎来到人工智能的未来:生成式人工智能!您是否想知道机器如何学习理解人类语言并做出相应的反应?让我们来看看ChatGPT ——OpenAI 开发的革命性语言模型。凭借其突破性的 GPT-3.5 架构,ChatGPT 席卷了世界,改变了我们…...
KafKa脚本操作
所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…...
【自动化运维】playbook剧本
目录 一、Ansible 的脚本 playbook 剧本1.1playbooks的组成 二、剧本编写实验2.1定义、引用变量2.2使用远程主机sudo切换用户2.3whenn条件判断2.4迭代 三、Templates 模板四、Tags模板 一、Ansible 的脚本 playbook 剧本 1.1playbooks的组成 (1)Tasks&…...
java中双引号和单引号的区别
起因 刷题的时候,有判断是否相同的情况,然后我发现单引号和双引号在上的表现不一样,所以记录一下。 解释 在Java中,双引号(" ")和单引号(’ )在使用上有很重要的区别&a…...
jenkinsfile指定jenkins流水线的构建号
背景 升级Jenkins过程中不小心导致流水线配置文件job目录丢失, 重新配置流水线后所有流水线构建号码都从1开始构建了, 然而我们的产品关联了jenkins构建号,重新从1 构建会导致各种问题. 解决方案 在Jenkinsfile文件中指定流水线的构建号为一个不存在的数字, 这样就不会冲突了…...
微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal
效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})...
深度学习论文: Q-YOLO: Efficient Inference for Real-time Object Detection及其PyTorch实现
深度学习论文: Q-YOLO: Efficient Inference for Real-time Object Detection及其PyTorch实现 Q-YOLO: Efficient Inference for Real-time Object Detection PDF: https://arxiv.org/pdf/2307.04816.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代…...
解读随机森林的决策树:揭示模型背后的奥秘
一、引言 随机森林[1]是一种强大的机器学习算法,在许多领域都取得了显著的成功。它由多个决策树组成,而决策树则是构建随机森林的基本组件之一。通过深入解析决策树,我们可以更好地理解随机森林模型的工作原理和内在机制。 决策树是一种树状结…...
OceanMind海睿思获评中国信通院“内审数字化产品评测”卓越级(最高级)!
2023年7月27日,由中国内部审计协会、中国通信标准化协会指导,中国信息通信研究院主办的第二届数字化审计论坛在北京成功召开。 大会聚焦内部审计数字化领域先进实践、研究成果、行业发展举措,重磅发布了多项内部审计数字化领域的最新研究和实…...
TPlink云路由器界面端口映射设置方法?快解析内网穿透能实现吗?
有很多网友在问:TPlink路由器端口映射怎么设置?因为不懂端口映射的原理,所以无从下手,下面小编就给大家分享TPlink云路由器界面端口映射设置方法,帮助大家快速入门TP路由器端口映射设置方法。 1.登录路由器管理界面&a…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
