欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Vue3和Element Plus實現(xiàn)一個可定制的動態(tài)表格列配置組件

 更新時間:2025年07月09日 08:39:43   作者:P7Dreamer  
在后臺管理系統(tǒng)中,表格是最常用的數(shù)據(jù)展示方式之一,不同的用戶或不同的場景下,我們往往需要展示不同的表格列,本文將介紹如何基于 Vue 3 和 Element Plus 實現(xiàn)一個可定制的動態(tài)表格列配置組件,需要的朋友可以參考下

引言

在后臺管理系統(tǒng)中,表格是最常用的數(shù)據(jù)展示方式之一。不同的用戶或不同的場景下,我們往往需要展示不同的表格列,或者對列的顯示方式有不同的需求。本文將介紹如何基于 Vue 3 和 Element Plus 實現(xiàn)一個可定制的動態(tài)表格列配置組件,讓用戶可以自由選擇需要顯示的列、調(diào)整列的順序、配置列的顯示方式等。

組件設(shè)計思路

我們的動態(tài)表格列配置組件主要由三部分組成:

  1. CustomizeTableColumns - 負(fù)責(zé)單個表格列的渲染
  2. ColumnConfigDialog - 提供列配置的交互界面
  3. 主頁面 - 整合組件并提供數(shù)據(jù)

這種設(shè)計遵循了單一職責(zé)原則,每個組件只關(guān)注自己的核心功能,使得代碼更加清晰、易于維護。

核心組件實現(xiàn)

1. CustomizeTableColumns 組件

<template>
  <el-table-column
    :prop="column.prop"
    :label="column.label"
    :align="column.align || 'center'"
    :width="column.width"
    :min-width="column.minWidth"
    :fixed="column.fixed"
    :sortable="column.sortable"
    :formatter="column.formatter ? dateFormatter : null"
    show-overflow-tooltip
  >
    <!-- 自定義列模板 針對特殊列通過插槽進行特殊處理 -->
    <template #default="scope" v-if="column.slot">
      <slot name="column-cell" :column="column" :row="scope.row" :index="scope.$index"></slot>
    </template>
  </el-table-column>
</template>

<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'

const props = defineProps({
  column: {
    type: Object,
    required: true
  }
})
</script>

功能說明

  • 封裝了 el-table-column 的基本配置
  • 通過 slot 支持自定義列內(nèi)容渲染
  • 內(nèi)置了日期格式化功能

使用示例

<CustomizeTableColumns v-for="col in dynamicColumns" :key="col.prop" :column="col">
  <template #column-cell="{ column, row, index }">
    <!-- 自定義列內(nèi)容 -->
    <template v-if="column.prop === 'index'">
      {{ index + (queryParams.pageNo - 1) * queryParams.pageSize + 1 }}
    </template>
    <template v-else-if="column.prop === 'typeName'">
      <span
        style="cursor: pointer; color: #409eff"
        v-if="row.id"
        @click="openForm('preview', row.customerName, row.customerId, row.id)"
      >
        {{ row.typeName }}
      </span>
    </template>
  </template>
</CustomizeTableColumns>

2. ColumnConfigDialog 組件

<template>
  <el-dialog
    v-model="showDialog"
    title="表格列配置"
    width="800px"
    append-to-body
    class="column-config-dialog"
  >
    <!-- 對話框內(nèi)容 -->
  </el-dialog>
</template>

<script setup lang="ts">
import draggable from 'vuedraggable'

const props = defineProps({
  modelValue: Boolean,
  columns: Array,
  defaultColumns: Array
})

const emit = defineEmits(['update:modelValue', 'update:columns'])

// 控制對話框顯示
const showDialog = computed({
  get: () => props.modelValue,
  set: (value) => emit('update:modelValue', value)
})

// 臨時列配置
const tempColumns = ref([])

// 全選控制
const checkAll = computed({
  get: () => tempColumns.value.every(col => col.visible),
  set: (val) => tempColumns.value.forEach(col => col.visible = val)
})

// 保存配置
const saveColumnConfig = () => {
  const newColumns = tempColumns.value.map((col, index) => ({
    ...col,
    order: col.fixed ? col.order : index
  }))
  emit('update:columns', newColumns)
  showDialog.value = false
}
</script>

功能特點

  1. 列可見性控制:可以勾選顯示/隱藏列
  2. 拖拽排序:使用 vuedraggable 實現(xiàn)列順序調(diào)整
  3. 基礎(chǔ)配置:可以修改列名、對齊方式、寬度等
  4. 高級配置:支持固定列、最小寬度、排序等高級設(shè)置
  5. 全選/重置:一鍵全選或重置為默認(rèn)配置

3. 主頁面集成

<template>
  <!-- 表格部分 -->
  <el-table :data="list">
    <CustomizeTableColumns v-for="col in dynamicColumns" :key="col.prop" :column="col">
      <!-- 自定義列模板 -->
    </CustomizeTableColumns>
  </el-table>
  
  <!-- 配置對話框 -->
  <ColumnConfigDialog
    v-model="showColumnConfig"
    :columns="columnOptions"
    :default-columns="defaultColumns"
    @update:columns="handleColumnsUpdate"
  />
</template>

<script setup lang="ts">
// 默認(rèn)列配置
const defaultColumns = ref([])

// 當(dāng)前列配置
const columnOptions = ref([
  {
    prop: 'index',
    label: '序號',
    width: 80,
    fixed: 'left',
    align: 'center',
    slot: true,
    visible: true,
    order: 0
  },
  { 
     prop: 'customerName', 
     label: '客戶名稱', 
     width: 150, 
     align: 'center', 
     visible: true, 
     order: 1 
  },
  {
    prop: 'typeName',
    label: '任務(wù)名稱',
    align: 'center',
    slot: true,
    visible: true,
    sortable: false,
    showAdvanced: true,
    minWidth: 80,
    order: 2
  },
  {
    prop: 'publishUserName',
    label: '發(fā)布人',
    width: 150,
    align: 'center',
    visible: true,
    sortable: false,
    showAdvanced: true,
    order: 3
  },
  {
    prop: 'receiveUserName',
    label: '接收人',
    width: 150,
    align: 'center',
    visible: true,
    sortable: false,
    showAdvanced: false,
    order: 4
  },
  {
    prop: 'missionStatus',
    label: '狀態(tài)',
    width: 150,
    align: 'center',
    slot: true,
    visible: true,
    sortable: false,
    showAdvanced: false,
    order: 5
  },
  {
    prop: 'missionCancelReasonName',
    label: '作廢原因',
    width: 150,
    align: 'center',
    visible: true,
    sortable: false,
    showAdvanced: false,
    order: 6
  },
  {
    prop: 'missionRejectReasonName',
    label: '拒絕原因',
    width: 150,
    align: 'center',
    visible: true,
    sortable: false,
    showAdvanced: false,
    order: 7
  },
  {
    prop: 'missionRejectReasonDesc',
    label: '拒絕描述',
    width: 150,
    align: 'center',
    visible: true,
    sortable: false,
    showAdvanced: false,
    order: 8
  },
  {
    prop: 'publishTime',
    label: '發(fā)布時間',
    minWidth: 180,
    align: 'center',
    sortable: false,
    showAdvanced: false,
    formatter: true,
    visible: true,
    order: 9
  },
  { 
      prop: 'operation', 
      label: '操作', 
      visible: true, 
      minWidth: 140, 
      fixed: 'right', 
      slot: true 
  }
])

// 動態(tài)列(根據(jù)配置生成的可見列)
const dynamicColumns = computed(() => {
  return columnOptions.value
    .filter(col => col.visible)
    .sort((a, b) => a.order - b.order)
})

// 處理列更新
const handleColumnsUpdate = (newColumns) => {
  columnOptions.value = newColumns
}
</script>

關(guān)鍵技術(shù)點解析

1. 動態(tài)列渲染原理

動態(tài)列的核心是根據(jù)配置動態(tài)生成 el-table-column 組件:

const dynamicColumns = computed(() => {
  return columnOptions.value
    .filter(col => col.visible) // 過濾出可見的列
    .sort((a, b) => a.order - b.order) // 按順序排序
})

2. 列配置的數(shù)據(jù)結(jié)構(gòu)

每個列配置包含以下屬性:

interface ColumnConfig {
  prop: string // 字段名
  label: string // 顯示名稱
  width?: number // 列寬
  minWidth?: number // 最小寬度
  align?: 'left' | 'center' | 'right' // 對齊方式
  fixed?: 'left' | 'right' // 固定位置
  sortable?: boolean // 是否可排序
  visible: boolean // 是否顯示
  order: number // 排序序號
  slot?: boolean // 是否使用插槽
  formatter?: boolean // 是否需要格式化
  showAdvanced?: boolean // 是否顯示高級設(shè)置
}

最佳實踐建議

性能優(yōu)化

  • 對于大數(shù)據(jù)量的表格,使用虛擬滾動
  • 避免在列配置中使用復(fù)雜的計算屬性

用戶體驗

  • 提供配置導(dǎo)入/導(dǎo)出功能
  • 添加配置保存成功的提示
  • 考慮添加撤銷/重做功能

可訪問性

  • 為拖拽手柄添加ARIA標(biāo)簽
  • 確保對話框可以通過鍵盤操作

錯誤處理

  • 驗證列配置的合法性
  • 提供默認(rèn)配置回退機制

效果演示

總結(jié)

本文介紹了一個基于 Vue 3 和 Element Plus 的動態(tài)表格列配置組件的完整實現(xiàn)方案。通過將功能拆分為多個組件,我們實現(xiàn)了可維護的表格列配置的動態(tài)表格。關(guān)鍵點包括:

  1. 使用 vuedraggable 實現(xiàn)列順序拖拽調(diào)整
  2. 通過計算屬性實現(xiàn)動態(tài)列過濾和排序
  3. 利用 Vue 的響應(yīng)式系統(tǒng)實現(xiàn)配置的雙向綁定
  4. 提供基礎(chǔ)和高階的列配置選項

這種方案可以輕松集成到各種后臺管理系統(tǒng)中,大大提升了表格的靈活性和用戶體驗。開發(fā)者可以根據(jù)實際需求進一步擴展功能,如添加列分組、條件格式化等高級特性。

以上就是基于Vue3和Element Plus實現(xiàn)一個可定制的動態(tài)表格列配置組件的詳細(xì)內(nèi)容,更多關(guān)于Vue3 Element Plus動態(tài)表格列組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決VUE項目localhost端口服務(wù)器拒絕連接,只能用127.0.0.1的問題

    解決VUE項目localhost端口服務(wù)器拒絕連接,只能用127.0.0.1的問題

    這篇文章主要介紹了解決VUE項目localhost端口服務(wù)器拒絕連接,只能用127.0.0.1的問題
    2020-08-08
  • vue實現(xiàn)flv格式視頻播放效果

    vue實現(xiàn)flv格式視頻播放效果

    這篇文章主要介紹了vue實現(xiàn)flv格式視頻播放,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • vue中本地靜態(tài)圖片路徑寫法

    vue中本地靜態(tài)圖片路徑寫法

    這篇文章給大家介紹了vue中本地靜態(tài)圖片路徑寫法及Vue.js中引用圖片路徑的方式,需要的朋友參考下吧
    2018-03-03
  • vue+vant使用圖片預(yù)覽功能ImagePreview的問題解決

    vue+vant使用圖片預(yù)覽功能ImagePreview的問題解決

    這篇文章主要介紹了vue+vant使用圖片預(yù)覽功能ImagePreview的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 簡單聊聊Vue中的計算屬性和屬性偵聽

    簡單聊聊Vue中的計算屬性和屬性偵聽

    計算屬性用于處理復(fù)雜的業(yè)務(wù)邏輯,vue提供了檢測數(shù)據(jù)變化的一個屬性watch可以通過newVal獲取變化之后的值,這篇文章主要給大家介紹了關(guān)于Vue中計算屬性和屬性偵聽的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • vue動態(tài)的 BreadCrumb 組件el-breadcrumb ElementUI詳解

    vue動態(tài)的 BreadCrumb 組件el-breadcrumb ElementUI詳解

    這篇文章主要介紹了vue如何做一個動態(tài)的 BreadCrumb 組件,el-breadcrumb ElementUI
    ,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Element Collapse 折疊面板的使用方法

    Element Collapse 折疊面板的使用方法

    這篇文章主要介紹了Element Collapse 折疊面板的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Vue 對象和數(shù)據(jù)的強制更新方式

    Vue 對象和數(shù)據(jù)的強制更新方式

    這篇文章主要介紹了Vue 對象和數(shù)據(jù)的強制更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue結(jié)合el-dialog封裝自己的confirm二次確認(rèn)彈窗方式

    vue結(jié)合el-dialog封裝自己的confirm二次確認(rèn)彈窗方式

    這篇文章主要介紹了vue結(jié)合el-dialog封裝自己的confirm二次確認(rèn)彈窗方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 一文詳解如何在vue.config.js配置代碼混淆加密、壓縮

    一文詳解如何在vue.config.js配置代碼混淆加密、壓縮

    這篇文章主要介紹了如何在vue.config.js配置代碼混淆加密、壓縮的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2025-05-05

最新評論