vue3中el-table表頭篩選

效果如下,可以勾選表頭進行隱藏,也可以對表頭進行拖動排序
在這里插入圖片描述
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;若不存在則設置值并返回…