【uniapp】通用列表封装组件

news2024/11/26 22:27:03

uniapp页面一般都会有像以下的列表页面,封装通用组件,提高开发效率;
(基于uView前端框架)
在这里插入图片描述

首先,通过设计图来分析一下页面展示和数据结构定义

在这里插入图片描述

w-table组件参数说明

参数说明类型可选值默认值
toggle列表是否带更多和收起功能
toggle值为true时,配合prop-list中定义的show字段使用,show值为true时,收起情况下默认展示的列,false则默认不展示,点击更多展开时展示
toggle值为false时prop-list中定义的show值无效,表示全部默认展示,不需要展开收缩功能
booleantrue|falsetrue
prop-list定义的字段和列标题数组(对应PC端封装表格组件,内容格式一致)
例:[{label:‘废物名称’,prop:‘name’},{label:‘数字识别码’,prop:‘code’}]
array[]
table-data后台返回数据数组array[]

prop-list具体参数说明

参数说明类型可选值默认值
label列的标题名称(如图:废物名称)string
prop字段名array[]
show列表收起时默认展示,toggletrue时生效stringtrue|falsefalse
formatItem整体列插槽(例如上图俩个状态按钮列,不展示左边标题名称,则需要整体插槽实现)booleantrue|falsefalse
formatValue值插槽(例如返回值需要加单位,格式化等情况)
formatItemtrue时此属性不生效
booleantrue|falsefalse
propList数据格式
propList:[
	{label:'废物名称',prop:'title',show:true},
	{label:'数字识别码',prop:'name',show:true},
	{label:'危废标识',prop:'tag',show:true},
	{label:'废物代码',prop:'code',show:true},
	{label:'废物重量',prop:'weight',formatValue:true,show:true},//格式化值
	{label:'废物形态',prop:'name'},
	{label:'主要成分',prop:'name'},
	{label:'有害成分',prop:'name'},
	{label:'危险特性',prop:'name'},
	{label:'注意事项',prop:'name'},
	{label:'产生/收集单位',prop:'comp'},
	{label:'联系人',prop:'userName'},
	{label:'联系方式',prop:'phone'},
	{label:'产生日期',prop:'date'},
	{label:'备注',prop:'remark'},
	{label:'状态',prop:'status',formatItem:true,show:true},//格式化列默认展示
	{label:'二维码',prop:'qrcode',formatItem:true,show:false}//格式化列默认不展示
]
tableData数据格式
tableData:[{
	title:'HWCS20230908003',
	time:'2023-09-18 14:00',
	name:'废物名称',
	code:'1234567890123456789000030420230915101',
	tag:'7b9e9d22ca714365a1f6a6b338fc8fa3',
	code1:'900-041-49',
	weight:'30',
	unit:'kg',
	wasteStatus:1,
	reportStatus:0,
}]

具体代码

基础用法
<w-table :table-data="tableData" :prop-list="propList" :toggle="true"></w-table>
有格式化值和列的情况
<w-table :table-data="tableData" :prop-list="propList" :toggle="true">
	<template slot="header" slot-scope="scope">
		<view class="width w-flex row row-between borderB padding16">
			<view class="flex1 w-flex row">
				<text class="fs24 c-blue fwBold marginR10 flex-none"> {{scope.index < 10 ?'0'+(scope.index+1):scope.index+1}} </text>
					<text class="flex1 text-overflow c-text fs16">{{scope.row.title}}</text>
					</view>
				<text class="marginLR10 flex-none">{{scope.row.time}}</text>
			</view>
		</template>
		<template slot="weight" slot-scope="scope">
			<span>{{scope.row.weight}}{{scope.row.unit}}</span>
		</template>
		<template slot="status" slot-scope="scope">
			<view class="w-flex row row-between paddingLR30 paddingTB10">
				<u-tag text="待入库" mode="plain"/>
				<view v-if="scope.row.status == 0" class="" style="color:#FF7D00">
					<u-icon name="clock"></u-icon>
					<text class="marginL10">未上报</text>
				</view>
				<view v-else class="" style="color:#00B42A">
					<u-icon name="checkbox-mark"></u-icon>
					<text class="marginL10">已上报</text>
				</view>
			</view>
		</template>
		<!-- 二维码 -->
		<template slot="qrcode" slot-scope="scope">
			<view class="w-flex"> 
				<img class="width160 height160" src="/static/img/qrcode.png" alt="">
			</view>
		</template>
	</w-table>

w-table组件源码

<template>
	<view class="width w-table">
		<view
			v-if="tableData.length > 0"
			class="w-flex col item-list marginB20 marginLR20 radius8 relative"
			v-for="(item, index) in tableData"
			:key="index">
			<slot name="header" :row="item" :index="index"></slot>
			<view class="width w-flex col paddingT15">
				<!-- <u-read-more class="width" :toggle="true" closeText="更多" :showHeight="showHeight" color="#4E5969"> -->
					<u-cell-group>
						<template v-for="(cellItem,i) in propList">
							<template v-if="!cellItem.formatItem">
								<!-- 默认展示 show为true时  或者 不需要折叠时执行展示列 -->
								<view class="default-show" v-if="cellItem.show || !toggle">
									<u-cell-item :title="cellItem.label" :key="i" :arrow="false">
										<slot v-if="typeof cellItem.formatValue === 'boolean' ? cellItem.formatValue : false"
											:row="item" :name="cellItem.prop" :index="index"></slot>
										<text v-else>{{$util.formatTextEmpty(item[cellItem.prop])}}</text>
									</u-cell-item>
								</view>
								<!-- 默认不展示 -->
								<view class="default-notshow" v-if="!cellItem.show && item.isShow">
									<u-cell-item :title="cellItem.label" :key="i" :arrow="false">
										<slot v-if="typeof cellItem.formatValue === 'boolean' ? cellItem.formatValue : false"
											:row="item" :name="cellItem.prop" :index="index"></slot>
										<text v-else>{{$util.formatTextEmpty(item[cellItem.prop])}}</text>
									</u-cell-item>
								</view>
							</template>
							<template v-if="cellItem.formatItem">
								<!-- 整体插槽列默认展示 -->
								<slot v-if="cellItem.show" :name="cellItem.prop" :row="item" :index="index"></slot>
								<!-- 整体插槽列默认不展示 并且 列表展开时展示 -->
								<slot v-if="!cellItem.show && item.isShow" :name="cellItem.prop" :row="item" :index="index"></slot>
							</template>
						</template>
						<view v-show="toggle" class="width padding20 textCenter">
							<span v-show="!item.isShow" @click="toggleCell(index,true)">更多<u-icon name="arrow-down" class="marginL5"></u-icon></span>
							<span v-show="item.isShow" @click="toggleCell(index,false)">收起<u-icon name="arrow-up" class="marginL5"></u-icon></span>
						</view>
					</u-cell-group>
				<!-- </u-read-more> -->
			</view>
		</view>
	</view>
</template>

<script>
	export default{
		props:{
			tableData:{
				default:[],
				type:Array,
			},
			propList:{
				default:[],
				type:Array,
			},
			showHeight:{
				default:500,
				type:Number,
			},
			toggle:{
				default:true,
				type:Boolean,
			}
		},
		data(){
			return{
				
			}
		},
		mounted(){
			if(this.toggle){
				// 可以展开收起时,给表格默认增加isShow属性
				this.tableData.forEach(item=>{
					this.$set(item,'isShow',!this.toggle)
				})
			}else{
				// 不需要收缩功能时,每一列数据默认是true,即展示,
				// 也就是toggle为false时,propList设置show属性无效,均为true
				this.propList.forEach(item=>{
					this.$set(item,'show',!this.toggle)
				})
			}
		},
		methods:{
			toggleCell(i,value){
				this.$set(this.tableData[i],'isShow',value)
			}
		}
	}
</script>

<style lang="scss" scoped>
	::v-deep.u-cell{
		align-items: flex-start;
	}
	::v-deep.u-cell-box{
		text-indent: initial;
	}
	::v-deep.w-table .u-content__showmore-wrap{
		background-image:none !important;
	}
	::v-deep.w-table .u-cell_title{
		width: 90px !important;
		flex: none;
		font-size: 13px !important;
	}
	::v-deep.w-table .u-cell__value{
		text-align: left !important;
		overflow-wrap: break-word;
	}
</style>

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

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

相关文章

栈的应用:括号匹配,递归

目录 1.栈的应用1.括号匹配问题算法实现 2. 递归栈在递归中的应用 3.队列的应用 1.栈的应用 1.括号匹配问题 ①可用栈实现该特性&#xff1a;最后出现的左括号最先被匹配&#xff08;LIFO)。 ②出栈&#xff1a;每出现一个右括号&#xff0c;就“消耗”一个左括号。 ③匹配失败…

如何将 ONLYOFFICE 文档 7.5 与 Odoo 进行集成

在本教程中&#xff0c;我们将了解如何使用集成应用实现 ONLYOFFICE 文档与 Odoo 之间的连接。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档、电子表格和演示文稿的查看和编辑功能。它高度兼容微软 Office 格式&#xff0c;包括…

Unity UGUI之Button控件的简单认识

Unity通过菜单或者Hierarchy面板创建Button,将会自动创建一个Image和Button控件&#xff0c;并且Transition属性默认选择Color Tint模式&#xff0c;除此之外还创建了个文本子对象。如下图所示&#xff1a; 而使用Inspector面板中Add Component只会创建Button控件。Transition属…

听说,工作能力强的项目经理都有这几个特征

大家好&#xff0c;我是老原。 很多项目经理每天忙忙碌碌&#xff0c;但是一看结果&#xff0c;团队业绩没有完成、人才没有培养起来、自己的管理水平和个人领导力也没有得到提升。 明明付出了很多时间和精力&#xff0c;结果却只收获了团队的抱怨&#xff0c;以及老板对你管…

UnoCss(原子化css引擎) 让你的开发更轻松愉快

什么是原子化CSS&#xff0c;UnoCSS又是什么&#xff0c;对此有疑问的推荐看下antfu的这篇文章——重新构想原子化 CSS (antfu.me) 相信看完这篇文章的你也会跟我一样热衷于UnoCSS. 介绍 今天介绍一个CSS开发利器 UnoCSS , 是一个具有高性能且极具灵活性的即时原子化 CSS 引擎…

web框架与Django

web应用程序 什么是web Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件 应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序&#xff0c;也就是说这…

ubuntu 18.04安装自己ko驱动 修改secure boot

因为本人老折腾自己的电脑&#xff0c;所以老重装系统&#xff0c;然后配置又不见了&#xff0c;这次配置赶紧记下来 insmod netlink_test.ko 报错&#xff1a;insmod: ERROR: could not insert module netlink_test.ko: Operation not permitted 添加 sudo insmod netlink_te…

C++跨模块传递CRT引发问题

SDK新增加了一个接口&#xff0c;参数使用std::vector<Class>&&#xff0c;传给dll函数中填充数值&#xff0c;然后应用层拿到这个vector出现了崩溃 越界等问题&#xff0c;调了很久&#xff0c;之前知道这个问题&#xff0c;没有想起来&#xff0c;耽误了许多时间。…

kubernetes资源监控

目录 一、资源限制 1、limitrange 2、ResourceQuota 二、metrics-server 三、图形化监控和代码行监控 1、dashboard 2、k9s 四、hpa 一、资源限制 Kubernetes采用request和limit两种限制类型来对资源进行分配。request(资源需求)&#xff1a;即运行Pod的节点必须满足运…

用友NC Cloud accept.jsp任意文件上传漏洞

一、漏洞描述 NC Cloud是用友推出的大型企业数字化平台。 用友网络科技股份有限公司NC Cloud存在任意文件上传漏洞&#xff0c;攻击者可利用该漏洞获取服务器控制权。 二、网络空间搜索引擎查询 fofa查询 icon_hash"1085941792" 三、漏洞复现 POC POST /aim/equi…

Linux程序设计shell程序学习

目录 1、编写shell脚本&#xff0c;通过循环的形式在终端上打印出等腰梯形 2、编写一个bash脚本程序&#xff0c;用for循环实现将当前目录下的所有.c文件移到指定的目录下&#xff0c;最后在显示器上显示指定目录下的文件和目录。 3、自行编写 shell 脚本&#xff0c;实现从…

Linux防火墙firewalld(粗糙版)

上篇是iptables的增删改查 自定义链&#xff1a; systemctl stop firewalld setenforce 0 iptables -N lmn iptables -vnL iptables -t filter -vnL 修改链名&#xff1a; iptables -E lmn ky01 iptables -t filter -vnL iptables -t filter -I ky01 -p icmp -j ACCEP…

RHCSA --- Linux命令替换

命令替换 把命令中某个子命令替换为其执行结果 $() echo "The current directory is $(pwd)." touch ./file$(date %H-%M-%S).txt 以文件创建时间并以相应格式命名文件 date 显示时间 echo "The current direct…

VueCli 自定义创建项目及配置

一、VueCli 自定义创建项目 1.安装脚手架 (已安装) npm i vue/cli -g2.创建项目 vue create hm-exp-mobile选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > Manually select features 选自定义手动…

12.输入一个小于1000的整数,输出平方根(不是整数,输出整数部分)

#include<stdio.h> #include<math.h>int fun(int n){int b;b pow(n,0.5);printf("%d",b);}int main(){int n;scanf("%d",&n); fun(n);return 0;}

什么是代理IP池?真实测评IP代理商的IP池是否真实?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

毫米波雷达在环境监测中的应用:气象学和气候研究的前沿技术

随着气候变化和环境问题的日益突出&#xff0c;科学家们正在寻找更先进的技术来监测大气和气候变化。毫米波雷达技术正崭露头角&#xff0c;成为气象学和气候研究领域的一项重要工具。本文将探讨毫米波雷达在环境监测中的应用&#xff0c;特别聚焦于其在气象学和气候研究方面的…

Spring Cloud LoadBalancer 负载均衡策略与缓存机制

目录 1. 什么是 LoadBalancer &#xff1f; 2. 负载均衡策略的分类 2.1 常见的负载均衡策略 3. 为什么要学习 Spring Cloud Balancer &#xff1f; 4. Spring Cloud LoadBalancer 内置的两种负载均衡策略 4.1 轮询负载均衡策略&#xff08;默认的&#xff09; 4.2 随机负…

Crypto(9)[MRCTF2020]keyboard

下载题目&#xff0c;看看里面是什么 这是什么鬼&#xff0c;由题目可以获得线索&#xff0c;keyboard,不是键盘吗&#xff0c;然后看了看别人写的wp&#xff0c;发现是九键&#xff0c;有几个数字对应的密文就是第几个字母 比如第一个6&#xff0c;对应的字母是mno&#xff0c…

R数据分析:净重新分类(NRI)和综合判别改善(IDI)指数的理解

对于分类预测模型的表现评估我们最常见的指标就是ROC曲线&#xff0c;报告AUC。比如有两个模型&#xff0c;我们去比较下两个模型AUC的大小&#xff0c;进而得出两个模型表现的优劣。这个是我们常规的做法&#xff0c;如果我们的研究关注点放在“在原模型新引入一个预测变量&am…