微信小程序-uniapp-切换tab时数据列表如何切换?

如图:

这里有两个tab,要保证每次切换后列表保持不变,就必须在运行时要有两个持久化的数据源,每个tab是一个列表,让我们来设计一下这样的数据结构。

首先我们的数据结构是这样的:

体现在vue的data是这样的:

正好对应tab的索引,当tab改变时,tab会回调索引:

模版中则动态切换使用的数据源:

总结就是:tab默认索引为0,点击另一个tab时,在回调中改变当前data的subsection_current为回调的index,这样模版就能动态切换数据源了。

解决了动态切换数据源的问题,我们再讨论下如何页面滑动切换tab,我这里使用的是swiper组件。

首先我会默认初始tab个数的swiper组件到页面:

每个swiper组件内嵌了一个瀑布流组件,这个组件原是uniapp插件市场下载的,但是有一些问题,首先不能一次性加载多张图片,而是需要一张图片加载完成才能加载下一张图片,我在此基础上改进后,可以一次性加载一页的全部图片,并且扩展了一些自己的需求,基本上算重构了。

瀑布流的原理就是布局为两列或者多列,每页数据轮流放到每一列中,如第一次是第一列,那么第二次就放到第二列,依次类推。

我在swiper组件上有一个动态设置height的代码,这是因为swiper的高度需要是固定的一个值,也可以动态改变,我就会在每次分配数据到瀑布流的列之后计算一下两列的高度,返回最高一列的高度到父组件,再动态设置到swiper上。

附上瀑布流动态分配代码以及获取高度并重新分配、回调高度重新设置swiper高度的代码。

首先是初次初始化瀑布流组件时:

handleViewRender函数方法体代码如下:

关键的获取下一次需要分配数据到那列的方法以及获取最高一列高度的代码如下:

获取瀑布流中最高一列的高度:

我们再回到handleViewRender方法,每次分配数据到列都会emit一次高度信息:

我们看看父组件是如何接受和处理通知的:

处理的方法很简单,只是重新计算下每个tab的高度而已:

为啥这里还多加了一个this.swpier_bottom_height呢?

因为emit的高度可能不够,所以额外多加点高度撑起来,我这边设置的高度为:

我们再回首看看swiper的:style:

当某个tab内容发生改变时,瀑布流组件就会通知父组件,父组件再更改每个数据源中tab索引对应的height即可,这样就能实现动态设置swiper高度了。

不错,到这里这个页面已经完成了切换tab时可以动态切换数据源的问题,高度也会自动重新设置,但是。。又一个新问题出现了,因为每个tab下的页面都是需要向下滚动的,比如tab1滚动了1000px的距离,但我没有操作tab2的页面,理应tab2的页面是没有滚动的,但实际是tab2的滚动距离也是1000px,追其根由就是两个tab的滚动距离没有独立出来。

所以我们又需要将每个tab的滚动高度也独立出来,和每个tab有独立的数据源一样,滚动距离也是每个tab独有的,我是这么设计数据结构的:

再多加一个字段单独记录每个tab的滚动记录,如tab1滚动了500px,tab2滚动了1000px,我切换到tab1时,设置滚动距离为500,切换到tab2时,设置滚动距离为1000px,理论的思路如上,我们进入代码部分:
滚动我使用了z-paging组件,这个组件提供了相当丰富的扩展,基本满足上拉加载、下拉刷新的全部需求了:

处理每次滚动时的回调:

直接设置每个数据源的滚动距离,设置完以后当切换tab时再动态设置为不同当前tab索引的滚动距离即可:

z-paging也提供了相应方法可以直接滚动到相应的位置。

OK,到这里我们完成了点击或者左右滑动时都能切换tab,以及切换到不同tab时不同的数据源、每个tab下数据加载时动态设置swiper高度、瀑布流自动依次分配数据到不同列的整体完整需求。

大家可以微信搜索:《一方云知》体验一下上述的功能,因为我的后端是如果半个小时内没有访问的话自动关机的,所以大家遇到页面一只loading的话,可能等待1-2分钟即可启动了。

该功能路径:打开小程序->精选图片。

这篇分享文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎在评论区留言,我会尽力回答。同时,如果你觉得这篇文章对你有帮助,不妨点个赞并分享给其他同学,让更多人受益。

想要了解更多相关知识,可以查看我以往的文章,其中有许多精彩内容。记得关注我,获取及时更新,我们可以一起学习、讨论技术,共同进步。

感谢你的阅读与支持,期待在未来的文章中与你再次相遇!

我的微信公众号:【xdub】,欢迎大家订阅,我会同步文章到公众号上。

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

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

相关文章

Qt多线程之moveToThread()函数

文章目录 一、moveToThread()执行后,当前代码线程没有改变。二、对象执行moveToThread()后,哪些成员加入了子线程1、创建对象时不指定父对象2、对属性对象使用moveToThread加入子线程作用域3、将属性对象的创建放到子线程中执行 三、C内存模型 在使用“继…

ollama系统更改模型存放位置

1.windows 设置完后可以在cmd中检查一下:echo %ollama_models% 2.linux 首先第一步:cd /etc/systemd/system/ 打开配置文件vim ollama.service 第二步:目录下的environment里面分号隔开添加OLLAMA_MODELS环境变量 第三步:source …

【Kadane】Leetcode 918. 环形子数组的最大和【中等】

环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i 1) % n] ,nums[i] 的前一个元素是 nums…

工作组局域网-ARP欺骗-攻击防御单双向

免责声明:本文仅做技术交流与学习... 目录 断网限制-单向 环境: 演示: win10: 欺骗前 欺骗后 kali: kali执行命令: win10结果: 劫持数据-双向 欺骗: 网络分析: 防御--动态解析改静态 中间人攻击 断网限制-单向 环境: 靶机:win10 攻击机:kali…

硬件电路基础

说起来在华北理工大学某个实验室当了快一年的硬件部部长,但是能力水平还是在单片机编程和应用层面(虽然也很牛逼了,但是我不介意让我更牛逼一点)。对于硬件电路的基础还不是很够。在b站偶尔刷到了我们学校隔壁电协一个学长的毕业视…

抖某音号解封释放实名

##抖音账号封禁后如何解封呢 我相信,做过抖音,或者正在做抖音的朋友,都曾面临一种尴尬至极的局面,辛辛苦苦做起来的账号,或者刚刚准备好的账号,在一时之间,竟然被抖音官方封禁了! 实…

Java项目:110 springboot夕阳红公寓管理系统的设计与实现

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统有管理员,租客 管理员权限操作的功能包括对租客,访客,缴费,维修,留言,公…

OpenCV学习(4.11) OpenCV中的图像转换

1. 目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换利用Numpy中可用的FFT功能傅立叶变换的一些应用我们将看到以下函数:**cv.dft()** ,**cv.idft()** 等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用…

CoppeliaSim机器人模拟器与Matlab Simulink环境

一、CoppeliaSim机器人模拟器 CoppeliaSim(原名V-REP,Virtual Robot Experimentation Platform)是一款基于物理引擎的动力学机器人模拟器。它提供了一个集成的开发环境,支持传感器、机械、机器人、环境的系统建模与仿真。Coppeli…

【第9章】“基础工作流”怎么用?(图生图/局部重绘/VAE/更多基础工作流)ComfyUI基础入门教程

🎁引言 学到这里,大家是不是会比较纠结,好像还在持续学习新的东西,未来还有多少基础的东西要学习,才能正常使用ComfyUI呢? 这其实需要转变一个心态。 AI绘画还处于一个快速迭代的过程,隔三岔五的就会有很多新技术、新模型出现,ComfyUI目前同样处于一个快速更新的阶…

vue3之toRefs

import { reactive, toRefs } from vue;export default {setup() {// 创建一个响应式对象const state reactive({count: 0,name: Vue 3});// 使用toRefs将响应式对象的属性转换为响应式引用const refs toRefs(state);// 返回响应式引用,以便在模板中使用return {.…

白嫖 kimi 接口 api

说明:kimi当然是免费使用的人工智能AI,但是要调用api是收费的. 项目: https://github.com/LLM-Red-Team/kimi-free-api 原文地址: https://blog.taoshuge.eu.org/p/272/ railway部署 步骤: 打开Github,新建仓库新建名为Dockerfile文件(没有后缀&…

C#异步编程是怎么回事

首先以一个例子开始 我说明一下这个例子。 这是一个演示异步编程的例子。 输入job [name],在一个同步的Main方法中,以一发即忘的方式调用异步方法StartJob()。输入time,调用同步方法PrintCurrentTime()输出时间。输出都带上线程ID,便于观察。 可以看到,主线程不会阻塞。主…

Vision-LSTM: xLSTM 作为通用视觉主干

摘要 尽管Transformer最初是为自然语言处理引入的,但它现在已经被广泛用作计算机视觉中的通用主干结构。最近,长短期记忆(LSTM)已被扩展为一种可扩展且性能优越的架构——xLSTM,它通过指数门控和可并行化的矩阵内存结…

机器学习笔记 - 用于3D数据分类、分割的Point Net的网络实现

上一篇,我们大致了解了Point Net的原理,这里我们要进行一下实现。 机器学习笔记 - 用于3D数据分类、分割的Point Net简述-CSDN博客文章浏览阅读3次。在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transforme…

【MySQL】MySQL45讲-读书笔记

1、基础架构:一条SQL查询语句是如何执行的? 1.1 连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 mysql -h$ip -P$port -u$user -p输完命令之后,输入密码。 1.2 查询缓存 MySQL 拿到一个查询请求后,会先到查询缓…

透明屏幕的显示效果如何

透明屏幕的显示效果可以从以下几个方面进行评估和描述: 透明度:透明屏幕的透光率通常在50-90%左右,具体取决于屏幕的设计和用途。这种高透明度使得屏幕在不用时可以像普通玻璃一样透明,保持视野的清晰。 色彩表现:透明…

SAP MMRV/MMPV 物料账期月结月底月初开关

公告:周一至周五每日一更,周六日存稿,请您点“关注”和“在看”,后续推送的时候不至于看不到每日更新内容,感谢。 这是一条刮刮乐,按住全部选中:点关注的人最帅最美,欢迎&#xff1…

JavaScript快速入门系列-2(JavaScript语言基础)

第二章:JavaScript语言基础 2.1 变量声明:let, const, var2.1.1 变量是什么?2.1.2 var2.1.3 let与const2.1.4 选择哪个关键字? 2.2 数据类型2.2.1 基本数据类型2.2.2 复杂数据类型2.2.3 示例与类型检测 2.3 运算符2.3.1 算术运算符…

CATIA P3 V5-6R 中文版软件下载安装 达索CATIA三维设计软件获取

CATIA的建模和装配能力堪称业界翘楚。其强大的建模工具能够轻松应对各种复杂的几何形状和结构,帮助设计师们快速构建出精准的产品模型。同时,装配模块则能够实现零部件的快速装配,大大提高了设计效率。 在分析和仿真方面,CATIA同样…