vue3-elementplus跨頁多選

運(yùn)行效果:


Video_2025-09-02_173950.gif
<template>
  <div class="batch-delete-demo">
    <!-- 批量刪除按鈕 -->
    <el-button type="danger" @click="handleBatchDelete" :disabled="selectedIds.size === 0" style="margin-bottom: 16px">
      批量刪除 (已選 {{ selectedIds.size }} 項)
    </el-button>

    <!-- 表格(帶選擇框) -->
    <el-table :data="tableData" row-key="id" border style="width: 100%" @selection-change="handleSelectionChange"
      @select-all="handleSelectAll">
      <!-- 選擇列 -->
      <el-table-column type="selection" :reserve-selection="true"></el-table-column>

      <el-table-column prop="id" label="ID" width="100" />
      <el-table-column prop="name" label="名稱" width="200" />
      <el-table-column prop="content" label="內(nèi)容" />
    </el-table>

    <!-- 分頁控件 -->
    <div class="pagination-container">
      <el-pagination v-model:current-page="currentPage" :page-size="pageSize" :total="total"
        @current-change="handleCurrentChange" layout="prev, pager, next, jumper, ->, total" />
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import { ElMessage } from 'element-plus'
// 分頁參數(shù)
const currentPage = ref(1);
const pageSize = ref(5); // 每頁5條,方便演示跨頁
const total = ref(20); // 總數(shù)據(jù)20條(共4頁)

// 全局選中的ID集合(跨分頁保留)
const selectedIds = ref(new Set());
// 當(dāng)前頁數(shù)據(jù)
const tableData = ref([]);

// 初始化加載第一頁數(shù)據(jù)
onMounted(() => {
  loadPageData(currentPage.value);
});

// 加載指定頁的數(shù)據(jù)
const loadPageData = (page) => {
  // 模擬接口請求(實(shí)際項目中替換為真實(shí)接口)
  setTimeout(() => {
    // 生成當(dāng)前頁的模擬數(shù)據(jù)
    tableData.value = Array.from({ length: pageSize.value }, (_, i) => {
      const id = (page - 1) * pageSize.value + i + 1;
      return {
        id,
        name: `數(shù)據(jù) ${id}`,
        content: `這是第 ${page} 頁的第 ${i + 1} 條數(shù)據(jù)`
      };
    });
  }, 300);
};

// 切換頁碼時觸發(fā)
const handleCurrentChange = (page) => {
  currentPage.value = page;
  loadPageData(page);
  // 切換頁碼后無需手動操作,:reserve-selection="true"會自動根據(jù)ID匹配選中狀態(tài)
};

// 選擇項變化時更新全局選中集合
const handleSelectionChange = (selectedRows) => {
  // 清空當(dāng)前頁的選中狀態(tài)(避免重復(fù)計算)
  tableData.value.forEach(row => {
    selectedIds.value.delete(row.id);
  });
  // 添加當(dāng)前頁新選中的項
  selectedRows.forEach(row => {
    selectedIds.value.add(row.id);
  });
};

// 全選/取消全選當(dāng)前頁
const handleSelectAll = (selection) => {
  // 全選:添加當(dāng)前頁所有ID
  if (selection.length > 0) {
    tableData.value.forEach(row => {
      selectedIds.value.add(row.id);
    });
  } else {
    // 取消全選:移除當(dāng)前頁所有ID
    tableData.value.forEach(row => {
      selectedIds.value.delete(row.id);
    });
  }
};

// 批量刪除
const handleBatchDelete = () => {
  if (selectedIds.value.size === 0) return;

  // 模擬刪除操作(實(shí)際項目中調(diào)用刪除接口)
  console.log('批量刪除的ID:', Array.from(selectedIds.value));

  // 刪除后重置選中狀態(tài)和當(dāng)前頁數(shù)據(jù)
  selectedIds.value.clear();
  loadPageData(currentPage.value);
  ElMessage.success(`成功刪除 ${selectedIds.value.size} 條數(shù)據(jù)`);
};
</script>

<style scoped>
.pagination-container {
  margin-top: 16px;
  text-align: right;
}
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容