效果如下,可以勾选表头进行隐藏,也可以对表头进行拖动排序
在这里插入图片描述
index主界面

<script>
let tempHead = [];
const showFilter = ref<boolean>(false);
let tableHeadList = ref<TableHeadItem[]>([{ prop: "displayId", label: "编号", visible: true, sortable: true, isVis: true },{ prop: "status", label: "1", visible: true, sortable: false, isVis: true },// { prop: 'approveOpnion', label: '审批意见', visible: false },{ prop: "playType", label: "2", visible: true, sortable: false, isVis: true },{ prop: "ownerRoleId", label: "3", visible: true, sortable: true, isVis: true },{ prop: "approvalName", label: "4", visible: true, sortable: true, isVis: true },{ prop: "startTime", label: "5", visible: true, sortable: true, isPx: 350, isVis: true },{ prop: "airCraftName", label: "6", visible: true, sortable: false, isPx: 300, isVis: true },{ prop: "airspaceInfos", label: "7", visible: true, sortable: false, isVis: true },{ prop: "createTime", label: "8", visible: true, sortable: true, isPx: 200, isVis: true },
]);const openFilter = () => {let tbLists = JSON.parse(localStorage.getItem("taskTableHead") || "[]");if (tbLists.length !== 0) {tableHeadList.value = tbLists;tempHead = tbLists;} else {tempHead = tableHeadList.value;}showFilter.value = !showFilter.value;
};
const updateColumns = (val) => {localStorage.setItem("taskTableHead", JSON.stringify(val));nextTick(() => {tableHeadList.value = val;showFilter.value = false;});
};watchEffect(() => {let tbLists = JSON.parse(localStorage.getItem("taskTableHead") || "[]");tempHead = tableHeadList.value;if (tbLists.length !== 0) {tableHeadList.value = tbLists;tempHead = tbLists;} else {tempHead = tableHeadList.value;}
});
// 关闭表头筛选组件
const cancelFilter = () => {showFilter.value = false;
};
const changeVisable = (val, item) => {tempList.value = tempList.value.map(i => {if (i.label === item.label) {return { ...i, visible: val }}return i})
}
</script><template><div class="searchRight"><el-form-item class="newbtn"><div class="iconBtn" @click="handleExport"><img src="@/assets/imgs/planMonitor/download.png" alt="" /></div><div class="iconBtn filterBtn" @click="openFilter"><img src="@/assets/imgs/planMonitor/set_up.png" alt="" /></div><!-- 表头筛选组件 --></el-form-item><div class="filter" v-if="showFilter"><filterTable :tableHeadList="tempHead" @update-columns="updateColumns" @cancel-filter="cancelFilter" /></div></div>
</template>

filterTable

<script setup lang="ts">
import draggable from 'vuedraggable'
defineOptions({ name: 'FilterTable' })
interface TableHeadItem {id?: number | stringvisible: booleanlabel: stringprop: stringsortable?: booleanwidth?: number | stringisPx?: number
}
const props = defineProps({tableHeadList: {type: Array as () => TableHeadItem[],default: () => []}
})
const nameList = ref<TableHeadItem[]>([])
const tempList = ref<TableHeadItem[]>([])
watch(() => props.tableHeadList, (val) => {if(val.length !== 0) {nameList.value = val.map(item => ({ ...item }))tempList.value = val.map(item => ({ ...item }))}
}, { immediate: true })const emit = defineEmits(['updateColumns', 'cancelFilter'])
const changeVisable = (val, item) => {tempList.value = tempList.value.map(i => {if (i.label === item.label) {return { ...i, visible: val }}return i})
}const confirmFn = () => {nameList.value = tempList.value.map(item => ({ ...item }))emit('updateColumns', nameList.value)
}const cacelFn = () => {emit('cancelFilter')
}</script>
<template><div class="filterContainer"><div class="filterWrap"><draggable v-model="tempList" handle=".icon" animation="200" item-key="id"><template #item="{ element }"><div class="opreatItem" v-if="element.isVis"><div class="icon"></div><el-checkbox :label="element.label" :value="element.visible" :checked="element.visible" @change="changeVisable($event, element)" /></div></template></draggable></div><div class="btnBox"><el-button class="cancel" link @click="cacelFn">取 消</el-button><el-button class="confirm" link @click="confirmFn">确 定</el-button></div></div>
</template>
<style lang="scss" scoped>
.filterContainer {width: px(280);height: px(394);border-radius: px(5);border: px(1) solid #404d59;.filterWrap {height: px(338);overflow: auto;padding: px(18) 0;}.opreatItem {display: flex;align-items: center;padding: 0 px(18);}.opreatItem:hover {background: rgba(247, 247, 247, 0.1);}.icon {width: px(10);height: px(16);background-image: url('@/assets/imgs/planMonitor/checked.png');background-size: 100% 100%;cursor: crosshair;margin-right: px(15);}:deep(.el-checkbox__label) {width: px(84);height: px(20);font-family:PingFangSC,PingFang SC;font-weight: 400;font-size: px(14);color: #ffffff;line-height: px(20);text-align: left;font-style: normal;}.btnBox {height: px(55);display: flex;justify-content: flex-end;padding: 0 px(24);border-top: px(1) solid rgba(117, 183, 251, 0.5);.confirm {width: px(38);font-family:PingFangSC,PingFang SC;font-weight: 400;font-size: px(14);color: #75b7fb;line-height: px(20);text-align: left;font-style: normal;}.cancel {width: px(38);font-family:PingFangSC,PingFang SC;font-weight: 400;font-size: px(14);color: #999999;line-height: px(20);text-align: right;font-style: normal;}}
}
</style>

draggable

<template><el-text type="info" size="small"> 拖动左上角的小圆点可对其排序 </el-text><VueDraggable:list="formData":force-fallback="true":animation="200"handle=".drag-icon"class="m-t-8px"item-key="index"><template #item="{ element, index }"><divclass="mb-4px flex flex-col gap-4px border border-gray-2 border-rounded rounded border-solid p-8px"><!-- 操作按钮区 --><divclass="m--8px m-b-4px flex flex-row items-center justify-between p-8px"style="background-color: var(--app-content-bg-color)"><el-tooltip content="拖动排序"><Iconicon="ic:round-drag-indicator"class="drag-icon cursor-move"style="color: #8a909c"/></el-tooltip><el-tooltip content="删除"><Iconicon="ep:delete"class="cursor-pointer text-red-5"v-if="formData.length > 1"@click="handleDelete(index)"/></el-tooltip></div><!-- 内容区 --><slot :element="element" :index="index"></slot></div></template></VueDraggable><el-tooltip :disabled="limit < 1" :content="`最多添加${limit}个`"><el-buttontype="primary"plainclass="m-t-4px w-full":disabled="limit > 0 && formData.length >= limit"@click="handleAdd"><Icon icon="ep:plus" /><span>添加</span></el-button></el-tooltip>
</template><script setup lang="ts">
// 拖拽组件
import VueDraggable from 'vuedraggable'
import { usePropertyForm } from '@/components/DiyEditor/util'
import { any, array } from 'vue-types'
import { propTypes } from '@/utils/propTypes'
import { cloneDeep } from 'lodash-es'// 拖拽组件封装
defineOptions({ name: 'Draggable' })// 定义属性
const props = defineProps({// 绑定值modelValue: array<any>().isRequired,// 空的元素:点击添加按钮时,创建元素并添加到列表;默认为空对象emptyItem: any<unknown>().def({}),// 数量限制:默认为0,表示不限制limit: propTypes.number.def(0)
})
// 定义事件
const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit)// 处理添加
const handleAdd = () => formData.value.push(cloneDeep(props.emptyItem || {}))
// 处理删除
const handleDelete = (index: number) => formData.value.splice(index, 1)
</script><style scoped lang="scss"></style>

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

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

相关文章

数据结构 之 【排序】(直接选择排序、堆排序、冒泡排序)

目录 1.直接选择排序 1.1直接选择排序的思想 1.2直接选择排序的代码逻辑 1.3完整排序代码 1.3.1一次只选一个最值 1.3.2一次筛选出两个最值 1.4直接选择排序的时间复杂度与空间复杂度 2.堆排序 2.1堆排序的思想 2.2堆排序的具体步骤 2.3堆排序图解 2.4完整排序代码…

用手机当外挂-图文并茂做报告纪要

前阵参加一个峰会,看到演讲嘉宾每翻一页PPT,下面的观察就举起手机一顿拍。实话说这种拍下来的,难说还会拿出来看,而且再看的时候也未必能对应到当时主讲人的一些解释 。 如果现场将图片保存到笔记本电脑,并快速记录关键信息,这样听完一个报告可能就直接输出一篇报道了。 有…

Vue的ubus emit/on使用

这段代码是 Vue.js 组件中的 mounted 生命周期钩子函数&#xff0c;主要作用是监听一个名为 “macSelectData” 的全局事件。具体行为如下&#xff1a;分步解释&#xff1a;mounted() 生命周期钩子 当组件被挂载到 DOM 后&#xff0c;Vue 会自动调用 mounted() 方法。这里常用于…

rsync报错解决

问题说明 [rootlocalhost shyn]# rsync -avz --checksum "root192.168.159.133:/tmp/shyn" "/tmp /shyn"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! …

ArKTS: DAL,Model,BLL,Interface,Factory using SQLite

HarmonyOS 用ohos.data.rdb 用DBHelper.ets 共用调用SQLite 库&#xff0c;进行DAL,Model,BLL,Interface,Factory 框架模式&#xff0c;表为CREATE TABLE IF NOT EXISTS signInRecord ( id INTEGER PRIMARY KEY AUTOINCREMENT, employeeId TEXT NOT NULL, employeeName TEXT NO…

MySQL JSON 数据类型用法及与传统JSON字符串的对比 JSON数据类型简介

文章目录前言1. 基本用法JSON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引支持JSON存储对象和数组的性能考虑1. 存储对象2. 存储数组性能对比总结最佳实践建议前言 MySQL从 5.7 版本开始引入了 JSON 数据类型&#xff0c;专门用于存储 JSON 格式的数据。与传…

C++:list(1)list的使用

list的使用一.list基本的结构1.环状双向链表2.哨兵节点3.迭代器4.节点结构5.链表遍历6.迭代器失效二.list的基本使用1.test01函数&#xff1a;主要测试std::list的初始化方式及遍历2.test02函数&#xff1a;主要测试std::list的常用成员函数操作3.测试结果如下三.list的其他操作…

ArcGIS地形起伏度计算

地形起伏度计算地形起伏度步骤1&#xff1a;计算最大值。步骤2&#xff1a;计算最小值。步骤3&#xff1a;计算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程变异系数均为坡面复杂度因子&#xff0c;是一种宏观的地形信息因子&#xff0c;反映的是较大的区域内地表坡…

llama factory新手初步运行完整版

1、新建conda环境名称为llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可检查内部包是否纯净&#xff0c;要确保环境内包较纯净&#xff0c;不然后续安装对应包会出现一系列水土不服的问题&#xff0c;导致…

Tomcat与JDK版本对照全解析:避坑指南与生产环境选型最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

短视频矩阵的未来前景:机遇无限,挑战并存

在当今数字化信息飞速传播的时代&#xff0c;短视频以其独特的魅力迅速席卷全球&#xff0c;成为人们获取信息、娱乐消遣的重要方式之一。短视频矩阵作为一种高效的内容传播与运营模式&#xff0c;正逐渐展现出其强大的影响力和潜力。本文将深入探讨短视频矩阵的未来前景&#…

【数据结构】哈希——位图与布隆过滤器

目录 位图&#xff1a; 引入 位图实现&#xff1a; 位图的结构 插入数据(标记数据) 删除数据(重置数据) 查找数据 位图完整代码&#xff1a; 位图的优缺点&#xff1a; 布隆过滤器&#xff1a; 引入 布隆过滤器实现&#xff1a; 布隆过滤器的结构&#xff1a; 插入…

本地运行C++版StableDiffusion!开源应用StableVerce发布

本地运行C版StableDiffusion&#xff01;开源应用StableVerce发布 StableVerse是一个用C开发的本地运行的图形工具。适合初学者快速入门&#xff1b;适用于办公室工作人员的文本和图像制作的小规模计算能力场景。 开源地址&#xff1a;https://github.com/kelvin-luo/StableVer…

OpenLayers 快速入门(七)矢量数据

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

【PTA数据结构 | C语言版】关于堆的判断

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 将一系列给定数字顺序插入一个初始为空的最小堆。随后判断一系列相关命题是否为真。命题分下列几种&#xff1a; x is the root&#xff1a;x是根结点&#xff1b;x and y are siblings&#xff1a…

[CH582M入门第十步]蓝牙从机

前言 学习目标: 1、初步了解BLE协议 2、BLE从机代码解析 3、使用手机蓝牙软件控制CH582M从机LED亮灭一、蓝牙介绍 蓝牙(Bluetooth)是一种短距离无线通信技术,主要用于设备之间的数据传输和通信。它由爱立信(Ericsson)于1994年提出,现由蓝牙技术联盟(Bluetooth SIG)维…

力扣(LeetCode) ——轮转数组(C语言)

题目&#xff1a;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入&#xff1a; nums [1,2,3,4,5,6,7]&#xff0c;k 3 输出&#xff1a; [5,6,7,1,2,3,4] 解释&#xff1a; 向右轮转 1 步:…

Rocky9部署Zabbix7(小白的“升级打怪”成长之路)

目录 一、关闭防火墙和SElinux和配置安装源 二、zabbxi服务器配置 1、安装Zabbix server&#xff0c;Web前端&#xff0c;agent &#xff0c;mysql-server 2、配置mysql数据库 3、为Zabbix server配置数据库 4、启动对应服务 三、登录zabbix 四、客户端部署 五、解决中…

python安装package和pycharm更改环境变量

安装numpy包 1、找到对应python版本的numpy包的版本 NumPy - News确认适配python版本的numpy&#xff0c;我安装 的python是3.11所以安装的numpy是2.2.0 2、修改pip安装的镜像源 1、全局修改&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.c…

Redis中的setnx命令为什么是原子性的

Redis的SETNX命令是一个原子性操作&#xff0c;这得益于其单线程架构的特性。Redis采用单线程模型&#xff0c;所有命令都在主线程中顺序执行&#xff0c;确保每个操作都具有原子性。执行SETNX时&#xff0c;Redis会首先检查指定key是否存在&#xff1a;若不存在则设置值并返回…