vue-next-admin vue3.x版本,table自定义

news2025/1/19 14:32:39

vue3.x版本,将table进行了封装。使用起来更方便了。但是,有时候我们需要将一组信息显示到一列中。所以我将其进行了简单的二次改造。支持table-column自定义。
table改造代码

<template>
	<div class="table-container">
		<el-table
			:data="data"
			:border="setBorder"
			v-bind="$attrs"
			row-key="id"
			stripe
			style="width: 100%"
			v-loading="config.loading"
			@selection-change="onSelectionChange"
		>
			<el-table-column type="selection" :reserve-selection="true" width="30" v-if="config.isSelection" />
			<el-table-column type="index" label="序号" width="60" v-if="config.isSerialNo" />
			<el-table-column
				v-for="(item, index) in setHeader"
				:key="index"
				show-overflow-tooltip
				:prop="item.key"
				:width="item.colWidth"
				:label="item.title"
			>
				<template v-slot="scope">
					<template v-if="item.isCustom">
            <slot :name="item.key" :row="scope.row"/>
          </template>
          <template v-else>
            <template v-if="item.type === 'image'">
              <el-image
                  :style="{ width: `${item.width}px`, height: `${item.height}px` }"
                  :src="scope.row[item.key]"
                  :zoom-rate="1.2"
                  :preview-src-list="[scope.row[item.key]]"
                  preview-teleported
                  fit="cover"
              />
            </template>
            <template v-else>
              {{ scope.row[item.key] }}
            </template>
          </template>
				</template>
			</el-table-column>
			<el-table-column label="操作" min-width="80" v-if="config.isOperate">
				<template v-slot="scope">
          <div>
            <slot name="other" :row="scope.row"/>
            <el-button  v-if="config.isEdit" text type="primary" @click="onEditRow(scope.row)">编辑</el-button>
            <el-popconfirm title="确定删除吗?" @confirm="onDelRow(scope.row)" v-if="config.isDel">
              <template #reference>
                <el-button text type="danger">删除</el-button>
              </template>
            </el-popconfirm>

          </div>

				</template>
			</el-table-column>
			<template #empty>
				<el-empty description="暂无数据" />
			</template>
		</el-table>
		<div class="table-footer mt15" v-if="!config.hideFooter">
			<el-pagination
				v-model:current-page="state.page.pageNumber"
				v-model:page-size="state.page.pageSize"
				:pager-count="5"
				:page-sizes="[10, 20, 30]"
				:total="config.total"
				layout="total, sizes, prev, pager, next, jumper"
				background
				@size-change="onHandleSizeChange"
				@current-change="onHandleCurrentChange"
			>
			</el-pagination>
			<div class="table-footer-tool">
				<SvgIcon name="iconfont icon-yunxiazai_o" :size="22" title="导出" @click="onImportTable" />
				<SvgIcon name="iconfont icon-shuaxin" :size="22" title="刷新" @click="onRefreshTable" />
				<el-popover
					placement="top-end"
					trigger="click"
					transition="el-zoom-in-top"
					popper-class="table-tool-popper"
					:width="300"
					:persistent="false"
					@show="onSetTable"
				>
					<template #reference>
						<SvgIcon name="iconfont icon-quanjushezhi_o" :size="22" title="设置" />
					</template>
					<template #default>
						<div class="tool-box">
							<el-tooltip content="拖动进行排序" placement="top-start">
								<SvgIcon name="fa fa-question-circle-o" :size="17" class="ml11" color="#909399" />
							</el-tooltip>
							<el-checkbox
								v-model="state.checkListAll"
								:indeterminate="state.checkListIndeterminate"
								class="ml10 mr1"
								label="列显示"
								@change="onCheckAllChange"
							/>
							<el-checkbox v-model="getConfig.isSerialNo" class="ml12 mr1" label="序号" />
							<el-checkbox v-model="getConfig.isSelection" class="ml12 mr1" label="多选" />
						</div>
						<el-scrollbar>
							<div ref="toolSetRef" class="tool-sortable">
								<div class="tool-sortable-item" v-for="v in header" :key="v.key" :data-key="v.key">
									<i class="fa fa-arrows-alt handle cursor-pointer"></i>
									<el-checkbox v-model="v.isCheck" size="default" class="ml12 mr8" :label="v.title" @change="onCheckChange" />
								</div>
							</div>
						</el-scrollbar>
					</template>
				</el-popover>
			</div>
		</div>
	</div>
</template>

<script setup lang="ts" name="netxTable">
import { reactive, computed, nextTick, ref } from 'vue';
import { ElMessage } from 'element-plus';
import printJs from 'print-js';
import table2excel from 'js-table2excel';
import Sortable from 'sortablejs';
import { storeToRefs } from 'pinia';
import { useThemeConfig } from '/@/stores/themeConfig';
import '/@/theme/tableTool.scss';

// 定义父组件传过来的值
const props = defineProps({
	// 列表内容
	data: {
		type: Array<EmptyObjectType>,
		default: () => [],
	},
	// 表头内容
	header: {
		type: Array<EmptyObjectType>,
		default: () => [],
	},
	// 配置项
	config: {
		type: Object,
		default: () => {},
	},
	// 打印标题
	printName: {
		type: String,
		default: () => '',
	},
});

// 定义子组件向父组件传值/事件
const emit = defineEmits(['delRow', 'pageChange', 'sortHeader']);

// 定义变量内容
const toolSetRef = ref();
const storesThemeConfig = useThemeConfig();
const { themeConfig } = storeToRefs(storesThemeConfig);
const state = reactive({
	page: {
		pageNumber: 1,
		pageSize: 10,
	},
	selectlist: [] as EmptyObjectType[],
	checkListAll: true,
	checkListIndeterminate: false,
});

// 设置边框显示/隐藏
const setBorder = computed(() => {
	return props.config.isBorder ? true : false;
});
// 获取父组件 配置项(必传)
const getConfig = computed(() => {
	return props.config;
});
// 设置 tool header 数据
const setHeader = computed(() => {
	return props.header.filter((v) => v.isCheck);
});
// tool 列显示全选改变时
const onCheckAllChange = <T>(val: T) => {
	if (val) props.header.forEach((v) => (v.isCheck = true));
	else props.header.forEach((v) => (v.isCheck = false));
	state.checkListIndeterminate = false;
};
// tool 列显示当前项改变时
const onCheckChange = () => {
	const headers = props.header.filter((v) => v.isCheck).length;
	state.checkListAll = headers === props.header.length;
	state.checkListIndeterminate = headers > 0 && headers < props.header.length;
};
// 表格多选改变时,用于导出
const onSelectionChange = (val: EmptyObjectType[]) => {
	state.selectlist = val;
};
// 删除当前项
const onDelRow = (row: EmptyObjectType) => {
	emit('delRow', row);
};
// 编辑当前项
const onEditRow = (row: EmptyObjectType) => {
	emit('editRow', row);
};
// 分页改变
const onHandleSizeChange = (val: number) => {
	state.page.pageSize = val;
	emit('pageChange', state.page);
};
// 分页改变
const onHandleCurrentChange = (val: number) => {
	state.page.pageNumber = val;
	emit('pageChange', state.page);
};
// 搜索时,分页还原成默认
const pageReset = () => {
	state.page.pageNumber = 1;
	state.page.pageSize = 10;
	emit('pageChange', state.page);
};
// 导出
const onImportTable = () => {
	if (state.selectlist.length <= 0) return ElMessage.warning('请先选择要导出的数据');
	table2excel(props.header, state.selectlist, `${themeConfig.value.globalTitle} ${new Date().toLocaleString()}`);
};
// 刷新
const onRefreshTable = () => {
	emit('pageChange', state.page);
};
// 设置
const onSetTable = () => {
	nextTick(() => {
		const sortable = Sortable.create(toolSetRef.value, {
			handle: '.handle',
			dataIdAttr: 'data-key',
			animation: 150,
			onEnd: () => {
				const headerList: EmptyObjectType[] = [];
				sortable.toArray().forEach((val: string) => {
					props.header.forEach((v) => {
						if (v.key === val) headerList.push({ ...v });
					});
				});
				emit('sortHeader', headerList);
			},
		});
	});
};

// 暴露变量
defineExpose({
	pageReset,
});
</script>

<style scoped lang="scss">
.table-container {
	display: flex;
	flex-direction: column;
	.el-table {
		flex: 1;
	}
	.table-footer {
		display: flex;
		.table-footer-tool {
			flex: 1;
			display: flex;
			align-items: center;
			justify-content: flex-end;
			i {
				margin-right: 10px;
				cursor: pointer;
				color: var(--el-text-color-regular);
				&:last-of-type {
					margin-right: 0;
				}
			}
		}
	}
}
</style>

使用方式: 配置中增加 isCustom在这里插入图片描述
在这里插入图片描述

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

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

相关文章

R语言的水文、水环境模型优化技术及快速率定方法与多模型案例实践

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

高速入门知识03:路阻抗匹配方法

文章目录 前言一、简单并行匹配二、戴维南并行匹配三、主动并行匹配四、串联RC并行匹配五、串联匹配六、差分对匹配七、收发器片内匹配 前言 高速电路阻抗匹配方法 阻抗不匹配会导致信号在传输线上来回反射&#xff0c;使负载接收器出现振铃。振铃降低了接收 器的动态范围&am…

Centos使用docker部署nacos

Centos使用docker部署nacos 对于使用Docker部署Nacos&#xff0c;您可以按照以下步骤进行操作&#xff1a; 在您的服务器上安装Docker和Docker Compose。创建一个用于存储Nacos数据的目录&#xff0c;例如/path/to/nacos/data。创建一个docker-compose.yml文件&#xff0c;并…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

vscode 端口转发实现端口映射,实现端口自由

用vscode连接server进行开发&#xff0c; 是非常方便的&#xff0c;但很多时候&#xff0c;server的端口开放的很有限&#xff0c;那么就可以利用vscode进行端口映射 举一个应用场景&#xff1a; 先通过A利用vscode 连接B&#xff0c;然后再vscode 的port窗口进行端口转发&…

Hadoop 之 HDFS 配置与使用(二)

HDFS 配置与使用 一.HDFS配置二.HDFS Shell1.默认配置说明2.shell 命令 三.Java 读写 HDFS1.Java 工程配置2.测试 一.HDFS配置 ## 基于上一篇文章进入 HADOOP_HOME 目录 cd $HADOOP_HOME/etc/hadoop ## 修改文件权限 chown -R root:root /usr/local/hadoop/hadoop-3.3.6/* ## …

LLMs之Baichuan:Baichuan-13B模型的简介(包括Baichuan-7B)、安装、使用方法之详细攻略

LLMs之Baichuan&#xff1a;Baichuan-13B模型的简介(包括Baichuan-7B)、安装、使用方法之详细攻略 导读&#xff1a;2023年6月15日&#xff0c;百川智能(搜狗创始人王小川创建)发布了首个大模型成果Baichuan-7B&#xff0c;开源可商用&#xff0c;它在C-Eval、AGIEval和Gaokao中…

java通过url获取视频时长(无需下载文件)

1、导入架包 <!-- jave 核心依赖 --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>2.4.6</version></dependency><!-- 根据不同操作系统引入不同FFmpeg包 --><!-- wi…

KEIL安装额外版本的arm compiler v6.16 v5.06update7

很多时候安装了一个版本的keil&#xff0c;但是别人的工程是拿另一个版本做的&#xff0c;重新安装也不是不行&#xff0c;但是会占很多地方&#xff0c;文件关联也很乱套&#xff0c;所以记录一下怎么安装额外的&#xff0c;比如我的是keil mdk530&#xff0c;自带Compiler v6…

Linux 离线安装软件

这里写目录标题 0.注意1.防火墙操作2.安装jdk1.上传jdk安装包2.安装3.配置环境变量 3.安装redis1.上传tar包2.安装命令3.项目连接时报错4.问题一保存信息解决 4.安装rabbitMq1.查看erlang与mq对应版本2.下载软件2.1下载erlang2.2下载rabbitMq 3.将文件拖放到linux4.安装5.开放端…

loki技巧 - 结构化log日志文本

将非结构化的log日志信息结构化为JSON格式&#xff0c;以方便在Grafana界面侧的浏览和查询。 0. 目录 1. 需求背景和描述2. 实现&#xff08;Promtail侧&#xff09;3. 注意事项4. 参考 1. 需求背景和描述 最近几个月&#xff0c;部门内部开始尝试统一日志收集、查询统计相关的…

没有广告的浏览器(AdBlock)

AdBlock是一个广告拦截器&#xff0c;可以帮你拦截所有浏览网站上的广告。 安装&#xff1a; 有梯子 1、官网 https://getadblock.com/zh_CN/ 2、点击【以及获得Adblock】跳转浏览器->扩展程序->插件详情页&#xff0c;目前支持 Chrome Firefox Edge Safari 浏览器&am…

KaiwuDB CTO 魏可伟:多模架构 —“化繁为简”加速器

以下为浪潮 KaiwuDB CTO 魏可伟受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录&#xff0c;欢迎大家点赞、收藏、关注&#xff01; 打造多模引擎&#xff0c;AIoT数据库探索之路 01 何为“繁”&#xff1f; 工业 4.0 时代&#xff0c; 物联网产业驱动数据要素市场不…

H3C-Cloud Lab实验-PPP实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. R1 和 R2 使用 PPP 链路直连&#xff0c;R2 和 R3 把 2 条 PPP 链路捆绑为 PPP MP 直连 2. 按照图示配置 IP 地址 3. R2 对 R1 的 PPP 进行单向 chap 验证 4. R2 和 R3 的 PPP 进行双向 chap 验证 实验步骤&#xff1a; …

SkipList

文章目录 SkipList理解跳表从单链表说起查找的时间复杂度空间复杂度插入数据更高效的方式维护索引代码实现索引的抽取概率算法 举例插入元素 删除数据总结为什么Redis选择使用跳表而不是红黑树来实现有序集合 SkipList 理解跳表从单链表说起 在原始单链表中查找元素&#xff…

C# Linq 详解三

目录 概述 十三、Sum / Min / Max / Average 十四、Distinct 十五、Concat 十六、Join 十七、ToList 十八、ToArray 十九、ToDictionary C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Linq 详解二 1.OrderBy 2.O…

HOT64-搜索二维矩阵

leetcode原题链接&#xff1a;搜索二维矩阵 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回…

Leetcode每日一题:979. 在二叉树中分配硬币(2023.7.14 C++)

目录 979. 在二叉树中分配硬币 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs&#xff08;后序遍历&#xff09; 原理思路&#xff1a; 979. 在二叉树中分配硬币 题目描述&#xff1a; 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对…

宋浩高等数学笔记(一)函数与极限

b站宋浩老师的高等数学网课&#xff0c;全套笔记已记完&#xff0c;不定期复习并发布更新。 章节顺序与同济大学第七版教材所一致。

C++虚函数学习

VC6新建一个单文档工程&#xff1b; 添加一个一般类&#xff1b; 生成的Shape.cpp保持不变&#xff1b; #include "Shape.h"#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]__FILE__; #define new DEBUG_NEW #endif// // Construction/Destruction //Shap…