【uniapp】通用列表封装组件

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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读者自荐的 4 个 GitHub 项目

本期推荐的 4 个开源项目&#xff0c;为读者在开源项目 Awesome-GitHub-Repo 的评论区自推的, 如果你开源了不错的项目&#xff0c;想让大家看到&#xff0c;也可以去 Awesome-GitHub-Repo 进行投稿。 本期推荐开源项目目录&#xff1a; 1. DB-GPT 2. 定制中国传统节日头像 3. …

零代码编程:用ChatGPT批量将Mp4视频转为Mp3音频

文件夹中有很多mp4视频文件&#xff0c;如何利用ChatGPT来全部转换为mp3音频呢&#xff1f; 在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将Mp4视频转为Mp3音频的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

Vue el-table序号与复选框hover切换

效果图下&#xff1a; <template><div class"container"><el-tableref"multipleTable"id"multipleTable":data"person.tableData"cell-mouse-enter"cellEnter"cell-mouse-leave"cellLeave"selecti…

网页【CSS】滚动条

前言 优化后的滚动条会提亮我们的网站页面。 例如&#xff1a;CSS-TRICKS这个网站如果采用的是浏览器默认的滚动条&#xff0c;不进行优化&#xff0c;页面会显得很不搭。 所以该网站的滚动条样式优化如下&#xff1a; html::-webkit-scrollbar {width: 30px;height: 30px; …

Leetcode---370周赛

题目列表 2923. 找到冠军 I 2924. 找到冠军 II 2925. 在树上执行操作以后得到的最大分数 2926. 平衡子序列的最大和 一、找到冠军I 第一题模拟题&#xff0c;简单来说是看每一行(列)是否全是1&#xff0c;当然不包括自己比自己强的情况&#xff0c;需要特判 代码如下 …

支持C#的开源免费、新手友好的数据结构与算法入门教程 - Hello算法

前言 前段时间完成了C#经典十大排序算法&#xff08;完结&#xff09;然后有很多小伙伴问想要系统化的学习数据结构和算法&#xff0c;不知道该怎么入门&#xff0c;有无好的教程推荐的。今天给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程&#xff1a;He…

STM32Cube +VSCode开发环境搭建

STM32Cube VSCode开发环境搭建 0.前言一、各种方式对比1.STM32CubeMX CLion2.STM32CubeIDE VSCode STM32 VSCode Extension3.VSCode EIDE插件 二、STM32CubeIDE VSCode STM32 VSCode Extension环境搭建1.需要安装的软件2.相关配置3.编译测试 三、总结 0.前言 工欲善其事&…

Qt QtCreator调试Qt源码配置

目录 前言1、编译debug版Qt2、QtCreator配置3、调试测试4、总结 前言 本篇主要介绍了在麒麟V10系统下&#xff0c;如何编译debug版qt&#xff0c;并通过配置QtCreator实现调试Qt源码的目的。通过调试源码&#xff0c;我们可以对Qt框架的运行机制进一步深入了解&#xff0c;同时…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…

【Git】Git安装入门使用常用命令Gitee远程仓库上传文件与下载

一&#xff0c;Git入门 1.1 Git是什么 Git是一款分布式版本控制系统&#xff0c;被广泛用于软件开发中的源代码管理。它由Linus Torvalds在2005年创造并发布&#xff0c;旨在解决传统版本控制系统&#xff08;如SVN&#xff09;的一些局限性。主要用于敏捷高效地处理任何或小或…

【解决方案】vue 项目 npm run dev 时报错:‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

报错 cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! estate1.0.0 dev: cross-env webpack-dev-server --inline --progress --config build/webpack.dev.conf.js npm ERR! Exit status 1 np…

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…

Dockerfile搭建lnmp

目录 任务需求&#xff1a; 一、准备&#xff1a; 二、部署nginx容器&#xff08;172.18.0.10&#xff09;&#xff1a; 1.编写Dockerfile构建镜像&#xff1a; 2.准备nginx配置文件&#xff1a; 3.构建镜像&#xff0c;启动nginx容器&#xff1a; 三、部署mysql容器&#x…

Flutter学习:使用CustomPaint绘制路径

Flutter学习&#xff1a;认识CustomPaint组件和Paint对象 Flutter学习&#xff1a;使用CustomPaint绘制路径 Flutter学习&#xff1a;使用CustomPaint绘制图形 Flutter学习&#xff1a;使用CustomPaint绘制文字 Flutter学习&#xff1a;使用CustomPaint绘制图片 drawPath 绘制路…

矢量绘图软件Sketch 99 for mac

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

C++ vector 动态数组的指定元素删除

文本旨在对 C 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除 代码 #include <iostream&g…

Python语言:经典例题分析讲解

题1&#xff1a; 通过观察我们可以得出以下结论&#xff1a; 代码实现&#xff1a; """ &#xff08;3&#xff09;输入整数n&#xff0c;输出n行的字符图案。如n5时输出以下图案&#xff1a;* *** ***** ******* *********""""" for…

河南开放大学与电大搜题微信公众号:携手共进,助力学习之路

作为河南省内颇具影响力和声誉的高等教育机构之一&#xff0c;河南开放大学一直致力于提供优质的教育资源和灵活的学习方式&#xff0c;以满足广大学习者的需求。而在这个追求知识的时代&#xff0c;学习者们尤其需要一个便捷、高效的工具来辅助学习。电大搜题微信公众号应运而…

python编程复习系列——week2(Input Output (2))

文章目录 一、多行代码语句二、Escape序列三、字符串格式四、数值运算课后作业 一、多行代码语句 &#x1f95e;使用反斜杠\来表示在下一行中继续使用一条语句。 subject_code "CSCI111" subject_mark 80 subject_grade "D" result "Subject re…

软件测试|黑盒测试方法论-判定表

在因果图分析法中最后会得出一个判定表&#xff0c;可以看出因果图和判定表是有联系的&#xff0c;一般需要结合起来使用。 因果图是一种分析工具&#xff0c;通过分析最终得到判定表&#xff0c;再通过判定表编写测试用例。在一定情况下也可以直接书写判定表&#xff0c;省略…