Vue3使用el-table組件實現(xiàn)分頁、多選以及回顯功能
需求
- 使用 dialog 顯示 table,同時關(guān)閉時銷毀
- el-table 表格多選
- 回顯已選擇的表格數(shù)據(jù),分頁來回切換依然正確顯示數(shù)據(jù)
- 點擊取消,數(shù)據(jù)回到初始化勾選狀態(tài)
思路
1、實現(xiàn)分頁多選并保存上一頁的選擇
分別添加以下屬性
Table 屬性
Table-column 屬性
<el-table ref="tableRef" row-key="id" @selection-change="handlechange"> <el-table-column type="selection" :reserve-selection="true" align="center" /> </el-table>
2、記錄當前選擇的數(shù)據(jù)
定義 el-table 的 selection-change 事件回調(diào)函數(shù)
const handlechange = (val: any[]) => { selected.value = val }
前兩步已經(jīng)能滿足不需要回顯的分頁多選功能,但是要實現(xiàn)數(shù)據(jù)的回顯還需要以下處理。
3、默認數(shù)據(jù)的回顯
假設(shè)定義兩個響應(yīng)式數(shù)組表示默認選擇和當前選擇
// 默認選中列表 const defaultSelected = ref<any[]>([]) // 當前選中的列表 const selected = ref<any[]>([]) // 通過 selection-change 事件回調(diào)保存當前選擇的數(shù)據(jù) const handlechange = (val: any[]) => { selected.value = val }
在顯示彈窗方法里通過 el-table 中的 toggleRowSelection 方法初始化選中所有默認選項(注意是所有的選項,而不只是當前頁的選項),如果只選擇當前頁的默認選項,selected 將會丟失其他默認選項
// 顯示表格彈窗 const showDialog = () => { getTableList() setTimeout(() => { for (const item of defaultSelected.value) tableRef.value.toggleRowSelection(item, true) // 選中默認選中的行 }, 0) visible.value = true }
至此實現(xiàn)了所有功能,總結(jié)一下原理就是 el-table 通過 row-key 來判斷是否已選擇,所以通過 toggleRowSelection 選擇所有默認的選項,不管點擊哪一頁都會正確回顯數(shù)據(jù),并且定義了 handlechange 會保存新的改變
如果每次確認后不銷毀 table 組件,需要調(diào)用 clearSelection 方法清空所有已選項
const handleClick = () => { // 保存新的數(shù)據(jù) defaultSelected.value = cloneDeep(selected.value) selected.value.length = 0 pagination.currentPage = 1 // 清空表格已選項 tableRef.value.clearSelection() visible.value = false }
完整代碼
記錄下代碼,互相學(xué)習(xí)提提意見
<script setup lang="tsx"> import { useI18n } from '@/hooks/web/useI18n' import { getTableListApi } from '@/api/table' import { TableData } from '@/api/table/types' import { ref, reactive, watch } from 'vue' import { ElTableColumn, ElTable, ElPagination, ElButton, ElDialog } from 'element-plus' import { cloneDeep } from 'lodash-es' const { t } = useI18n() const columns: any[] = [ { type: 'selection', width: 60, align: 'center' }, { field: 'title', label: t('tableDemo.title') }, { field: 'author', label: t('tableDemo.author') }, { field: 'display_time', label: t('tableDemo.displayTime'), sortable: true }, { field: 'importance', label: t('tableDemo.importance') }, { field: 'pageviews', label: t('tableDemo.pageviews') } ] const loading = ref(true) const visible = ref(false) const pagination = reactive({ currentPage: 1, // 當前頁數(shù) pageSize: 10, // 每頁顯示條數(shù) pageSizes: [10, 20, 30, 40, 50], // 每頁顯示個數(shù)選擇器的選項設(shè)置 total: 100 // 總條數(shù) }) const tableDataList = ref<TableData[]>([]) const tableRef = ref<any>() // 默認選中列表 const defaultSelected = ref<any[]>([]) // 當前選中的列表 const selected = ref<any[]>([]) const getTableList = async () => { // 分頁查詢方法 const res = await getTableListApi({ ...pagination, pageIndex: pagination.currentPage }) .catch(() => {}) .finally(() => { loading.value = false }) if (res) { tableDataList.value = res.data.list } } const showDialog = () => { getTableList() setTimeout(() => { for (const item of defaultSelected.value) tableRef.value.toggleRowSelection(item, true) // 選中默認選中的行 }, 0) visible.value = true } const handlechange = (val: any) => { selected.value = val } const handleClick = () => { defaultSelected.value = cloneDeep(selected.value) selected.value.length = 0 pagination.currentPage = 1 // 清空選項 tableRef.value.clearSelection() visible.value = false } watch(() => [pagination.currentPage, pagination.pageSize], getTableList, { immediate: true }) </script> <template> <!-- 控制彈窗顯示 --> <ElButton type="primary" @click="showDialog">顯示</ElButton> <!-- 表格彈窗 --> <el-dialog title="提示" v-model="visible" width="80%" destroyOnClose> <div class="w-full h-800px flex flex-col justify-between"> <el-table ref="tableRef" height="760px" :data="tableDataList" :loading="loading" row-key="id" @selection-change="handlechange" > <el-table-column v-for="column in columns" :type="column.type" :key="column.field" :prop="column.field" :label="column.label" :reserveSelection="true" /> </el-table> <div class="flex justify-start"> <el-button type="primary" @click="handleClick">確認</el-button> </div> <!-- 分頁器 --> <div class="flex justify-end"> <el-pagination background layout="total, sizes, prev, pager, next, jumper" v-model:current-page="pagination.currentPage" v-model:page-size="pagination.pageSize" :total="pagination.total" :page-sizes="pagination.pageSizes" /> </div> </div> </el-dialog> </template>
以上就是Vue3使用el-table組件實現(xiàn)分頁、多選以及回顯功能的詳細內(nèi)容,更多關(guān)于Vue3 el-table分頁、多選及回顯的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
npm安裝vue腳手架報錯警告npm WARN deprecated
安裝vue腳手架報錯可能具體原因比較多,可以根據(jù)報錯信息進行排查,本文主要介紹了npm安裝vue腳手架報錯警告npm WARN deprecated,感興趣的可以了解一下2023-11-11vue-cli+webpack項目打包到服務(wù)器后,ttf字體找不到的解決操作
這篇文章主要介紹了vue-cli+webpack項目打包到服務(wù)器后,ttf字體找不到的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08解決vue中修改export default中腳本報一大堆錯的問題
今天小編就為大家分享一篇解決vue中修改export default中腳本報一大堆錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Vue.js構(gòu)建你的第一個包并在NPM上發(fā)布的方法步驟
這篇文章主要介紹了Vue.js構(gòu)建你的第一個包并在NPM上發(fā)布的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05