亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3使用el-table組件實現(xiàn)分頁、多選以及回顯功能

 更新時間:2024年09月22日 09:36:29   作者:For.?tomorrow  
這篇文章主要介紹了Vue3使用el-table組件實現(xiàn)分頁、多選以及回顯功能,文中通過代碼示例介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

需求

  • 使用 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)文章

  • vue中使用typescript配置步驟

    vue中使用typescript配置步驟

    本文主要介紹了vue中使用typescript配置,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • npm安裝vue腳手架報錯警告npm WARN deprecated

    npm安裝vue腳手架報錯警告npm WARN deprecated

    安裝vue腳手架報錯可能具體原因比較多,可以根據(jù)報錯信息進行排查,本文主要介紹了npm安裝vue腳手架報錯警告npm WARN deprecated,感興趣的可以了解一下
    2023-11-11
  • vue使用transition組件動畫效果的實例代碼

    vue使用transition組件動畫效果的實例代碼

    這篇文章主要介紹了vue使用transition組件動畫效果的實例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • vue-cli+webpack項目打包到服務(wù)器后,ttf字體找不到的解決操作

    vue-cli+webpack項目打包到服務(wù)器后,ttf字體找不到的解決操作

    這篇文章主要介紹了vue-cli+webpack項目打包到服務(wù)器后,ttf字體找不到的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue路由教程之靜態(tài)路由

    vue路由教程之靜態(tài)路由

    這篇文章主要給大家介紹了關(guān)于vue路由教程之靜態(tài)路由的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 基于Vue-cli的一套代碼支持多個項目

    基于Vue-cli的一套代碼支持多個項目

    這篇文章主要介紹了基于Vue-cli的一套代碼支持多個項目的方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • el-upload多選文件上傳報錯解決方案

    el-upload多選文件上傳報錯解決方案

    本文主要介紹了el-upload多選文件上傳報錯解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 解決vue中修改export default中腳本報一大堆錯的問題

    解決vue中修改export default中腳本報一大堆錯的問題

    今天小編就為大家分享一篇解決vue中修改export default中腳本報一大堆錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 如何構(gòu)建 vue-ssr 項目的方法步驟

    如何構(gòu)建 vue-ssr 項目的方法步驟

    這篇文章主要介紹了如何構(gòu)建 vue-ssr 項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Vue.js構(gòu)建你的第一個包并在NPM上發(fā)布的方法步驟

    Vue.js構(gòu)建你的第一個包并在NPM上發(fā)布的方法步驟

    這篇文章主要介紹了Vue.js構(gòu)建你的第一個包并在NPM上發(fā)布的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論