您好,登錄后才能下訂單哦!
今天小編給大家分享一下vue怎么實現table-plus組件的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
配置型表格多級表頭/自定義表頭、形數據與懶加載用法等支持el-table大部分屬性和用法
內置loading加載
內置合并單元格
默認跨頁選擇
自定義列模板
劃重點:后面tableSmart的基礎組件
包裹層TableWrap.vue
<template> <div :class="s.tableWrap"> <slot></slot> <div :class="s.noData" v-if="!loading && list.length === 0"> <div> <d-icon :class="s.icon" type="no-data"></d-icon> <div :class="s.text">{{ text }}</div> </div> </div> </div> </template> <script> export default { props: { list: { type: Array, default: [], }, text: { type: String, default: '搜索不到您想要的數據~換個條件試一下', }, loading: { type: Boolean, default: false, }, }, data() { return {}; }, }; </script> <style lang="scss" module="s"> .tableWrap { position: relative; } .noData { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); > div { display: flex; align-items: center; flex-direction: column; justify-content: center; } .icon { font-size: 60px; color: $color-primary; } .text { color: #80848f; font-size: 14px; margin: 8px 0 16px; } } </style>
核心拓展
<script> import VTableWrap from './TableWrap.vue'; export default { components: { VTableWrap, }, props: { spanConfig: { type: Object, default: () => ({ propList: [], children: 'children', key: '', }), }, }, data() { return { domTable: '', loading: {}, }; }, computed: { list() { if (this.spanConfig.key) { const arr = []; this.$attrs.data.forEach((item) => { if (item[this.spanConfig.children] && item[this.spanConfig.children].length) { item[this.spanConfig.children].forEach((child) => { arr.push({ ...item, ...child, }); }); } else { arr.push({ ...item, }); } }); return arr; } return this.$attrs.data; }, // 合并多少個計算 spanArr() { let contactDot = 0; const spanArr = []; this.list.forEach((item, index) => { if (index === 0) { spanArr.push(1); } else { if (item[this.spanConfig.key] === this.list[index - 1][this.spanConfig.key]) { spanArr[contactDot] += 1; spanArr.push(0); } else { spanArr.push(1); contactDot = index; } } }); return spanArr; }, // 取要合并的index spanIndex() { const propList = this.$attrs.columns.map((item) => item.prop || item.property); return this.spanConfig.propList.map((prop) => ( propList.findIndex((key) => key === prop) )); }, }, mounted() { this.$nextTick(() => { // 此處勿使用document 會區找尋windows 作用域下生成的所有dom元素 this.domTable = this.$refs.table.$el.querySelector('.el-table__body'); if (this.domTable) { this.loading = this.$loading({ lock: true, customClass: this.s.customLoding, text: '', spinner: 'el-icon-loading', target: this.$refs.table.$el.querySelector('.el-table__body'), }); // 加載因為 render函數渲染執行 順序 此處需關閉 if (this.$attrs.loading === undefined) { this.loading.close(); } else { this.loading.visible = this.$attrs.loading; } } }); }, render(createElement) { const { columns = [] } = this.$attrs; // 加載 this.$nextTick(() => { this.$refs.table.doLayout(); if (this.domTable) { if (this.$attrs.loading === undefined) { this.loading.close(); } else { this.loading.visible = this.$attrs.loading; } } }); // 加上遞歸 const tableColumn = (item, index) => createElement( 'el-table-column', { props: { ...item, }, key: `${item.label}-${index}`, scopedSlots: { default: this.$scopedSlots[item.slotName] || '', header: this.$scopedSlots[item.slotHeaderName] || '', }, }, [ item.children && item.children.length && item.children.map((list, index) => tableColumn(list, index)), ], ); const table = createElement( 'el-table', { ref: 'table', props: { headerRowClassName: 'custom-table-header', 'span-method': this.objectSpanMethod, ...this.$attrs, data: this.list, }, on: { ...this.$listeners, }, scopedSlots: { append: this.$scopedSlots.append, }, }, [...columns.map((item, index) => tableColumn(item, index))], ); return createElement('VTableWrap', { props: { text: this.$attrs.emptyText, loading: this.$attrs.loading, list: this.$attrs.data, }, }, [table]); }, methods: { objectSpanMethod({ rowIndex, columnIndex, }) { if (this.spanIndex.includes(columnIndex)) { const _row = this.spanArr[rowIndex]; const _col = _row > 0 ? 1 : 0; return { rowspan: _row, colspan: _col, }; } }, clearSelection() { this.$refs.table.clearSelection(); }, toggleRowSelection(row, selected) { this.$refs.table.toggleRowSelection(row, selected); }, toggleAllSelection() { this.$refs.table.toggleRowSelection(); }, toggleRowExpansion(row, expanded) { this.$refs.table.toggleRowExpansion(row, expanded); }, setCurrentRow(row) { this.$refs.table.setCurrentRow(row); }, clearSort() { this.$refs.table.clearSort(); }, clearFilter(columnKey) { this.$refs.table.clearFilter(columnKey); }, doLayout() { this.$refs.table.doLayout(); }, sort(prop, order) { this.$refs.table.sort(prop, order); }, }, }; </script> <style lang="scss" module="s"> .customLoding { right: 1px; bottom: 1px; height: 100%; :global(.el-icon-loading){ display: none; } } </style>
參數 | 說明 | 類型 | 可選值 | 默認值 |
---|---|---|---|---|
data | 顯示的數據 | array | — | — |
height | Table 的高度,默認為自動高度。如果 height 為 number 類型,單位 px;如果 height 為 string 類型,則這個高度會設置為 Table 的 style.height 的值,Table 的高度會受控于外部樣式。 | string/number | — | — |
max-height | Table 的最大高度。合法的值為數字或者單位為 px 的高度。 | string/number | — | — |
stripe | 是否為斑馬紋 table | boolean | — | false |
border | 是否帶有縱向邊框 | boolean | — | false |
size | Table 的尺寸 | string | medium / small / mini | — |
fit | 列的寬度是否自撐開 | boolean | — | true |
show-header | 是否顯示表頭 | boolean | — | true |
highlight-current-row | 是否要高亮當前行 | boolean | — | false |
current-row-key | 當前行的 key,只寫屬性 | String,Number | — | — |
row-class-name | 行的 className 的回調方法,也可以使用字符串為所有行設置一個固定的 className。 | Function({row, rowIndex})/String | — | — |
row-style | 行的 style 的回調方法,也可以使用一個固定的 Object 為所有行設置一樣的 Style。 | Function({row, rowIndex})/Object | — | — |
cell-class-name | 單元格的 className 的回調方法,也可以使用字符串為所有單元格設置一個固定的 className。 | Function({row, column, rowIndex, columnIndex})/String | — | — |
cell-style | 單元格的 style 的回調方法,也可以使用一個固定的 Object 為所有單元格設置一樣的 Style。 | Function({row, column, rowIndex, columnIndex})/Object | — | — |
header-row-class-name | 表頭行的 className 的回調方法,也可以使用字符串為所有表頭行設置一個固定的 className。 | Function({row, rowIndex})/String | — | — |
header-row-style | 表頭行的 style 的回調方法,也可以使用一個固定的 Object 為所有表頭行設置一樣的 Style。 | Function({row, rowIndex})/Object | — | — |
header-cell-class-name | 表頭單元格的 className 的回調方法,也可以使用字符串為所有表頭單元格設置一個固定的 className。 | Function({row, column, rowIndex, columnIndex})/String | — | — |
header-cell-style | 表頭單元格的 style 的回調方法,也可以使用一個固定的 Object 為所有表頭單元格設置一樣的 Style。 | Function({row, column, rowIndex, columnIndex})/Object | — | — |
row-key | 行數據的 Key,用來優化 Table 的渲染;在使用 reserve-selection 功能與顯示樹形數據時,該屬性是必填的。類型為 String 時,支持多層訪問:user.info.id ,但不支持 user.info[0].id ,此種情況請使用 Function 。 | Function(row)/String | — | — |
empty-text | 空數據時顯示的文本內容,也可以通過 slot="empty" 設置 | String | — | 暫無數據 |
default-expand-all | 是否默認展開所有行,當 Table 包含展開行存在或者為樹形表格時有效 | Boolean | — | false |
expand-row-keys | 可以通過該屬性設置 Table 目前的展開行,需要設置 row-key 屬性才能使用,該屬性為展開行的 keys 數組。 | Array | — | |
default-sort | 默認的排序列的 prop 和順序。它的prop 屬性指定默認的排序的列,order 指定默認排序的順序 | Object | order : ascending, descending | 如果只指定了prop , 沒有指定order , 則默認順序是ascending |
tooltip-effect | tooltip effect 屬性 | String | dark/light | |
show-summary | 是否在表尾顯示合計行 | Boolean | — | false |
sum-text | 合計行第一列的文本 | String | — | 合計 |
summary-method | 自定義的合計計算方法 | Function({ columns, data }) | — | — |
span-method | 合并行或列的計算方法 | Function({ row, column, rowIndex, columnIndex }) | — | — |
select-on-indeterminate | 在多選表格中,當僅有部分行被選中時,點擊表頭的多選框時的行為。若為 true,則選中所有行;若為 false,則取消選擇所有行 | Boolean | — | true |
indent | 展示樹形數據時,樹節點的縮進 | Number | — | 16 |
lazy | 是否懶加載子節點數據 | Boolean | — | — |
load | 加載子節點數據的函數,lazy 為 true 時生效,函數第二個參數包含了節點的層級信息 | Function(row, treeNode, resolve) | — | — |
tree-props | 渲染嵌套數據的配置選項 | Object | — | { hasChildren: 'hasChildren', children: 'children' } |
-分割線- | --- | --- | --- | --- |
columns | 列表配置 | array | column | [] |
spanConfig | 合并表格配置 | object | spanConfig | [] |
slotName | 自定義插槽名字 | string | - | - |
事件名 | 說明 | 參數 |
---|---|---|
select | 當用戶手動勾選數據行的 Checkbox 時觸發的事件 | selection, row |
select-all | 當用戶手動勾選全選 Checkbox 時觸發的事件 | selection |
selection-change | 當選擇項發生變化時會觸發該事件 | selection |
cell-mouse-enter | 當單元格 hover 進入時會觸發該事件 | row, column, cell, event |
cell-mouse-leave | 當單元格 hover 退出時會觸發該事件 | row, column, cell, event |
cell-click | 當某個單元格被點擊時會觸發該事件 | row, column, cell, event |
cell-dblclick | 當某個單元格被雙擊擊時會觸發該事件 | row, column, cell, event |
row-click | 當某一行被點擊時會觸發該事件 | row, column, event |
row-contextmenu | 當某一行被鼠標右鍵點擊時會觸發該事件 | row, column, event |
row-dblclick | 當某一行被雙擊時會觸發該事件 | row, column, event |
header-click | 當某一列的表頭被點擊時會觸發該事件 | column, event |
header-contextmenu | 當某一列的表頭被鼠標右鍵點擊時觸發該事件 | column, event |
sort-change | 當表格的排序條件發生變化的時候會觸發該事件 | { column, prop, order } |
filter-change | 當表格的篩選條件發生變化的時候會觸發該事件,參數的值是一個對象,對象的 key 是 column 的 columnKey,對應的 value 為用戶選擇的篩選條件的數組。 | filters |
current-change | 當表格的當前行發生變化的時候會觸發該事件,如果要高亮當前行,請打開表格的 highlight-current-row 屬性 | currentRow, oldCurrentRow |
header-dragend | 當拖動表頭改變了列的寬度的時候會觸發該事件 | newWidth, oldWidth, column, event |
expand-change | 當用戶對某一行展開或者關閉的時候會觸發該事件(展開行時,回調的第二個參數為 expandedRows;樹形表格時第二參數為 expanded) | row, (expandedRows | expanded) |
方法名 | 說明 | 參數 |
---|---|---|
clearSelection | 用于多選表格,清空用戶的選擇 | — |
toggleRowSelection | 用于多選表格,切換某一行的選中狀態,如果使用了第二個參數,則是設置這一行選中與否(selected 為 true 則選中) | row, selected |
toggleAllSelection | 用于多選表格,切換所有行的選中狀態 | - |
toggleRowExpansion | 用于可展開表格與樹形表格,切換某一行的展開狀態,如果使用了第二個參數,則是設置這一行展開與否(expanded 為 true 則展開) | row, expanded |
setCurrentRow | 用于單選表格,設定某一行為選中行,如果調用時不加參數,則會取消目前高亮行的選中狀態。 | row |
clearSort | 用于清空排序條件,數據會恢復成未排序的狀態 | — |
clearFilter | 不傳入參數時用于清空所有過濾條件,數據會恢復成未過濾的狀態,也可傳入由columnKey組成的數組以清除指定列的過濾條件 | columnKey |
doLayout | 對 Table 進行重新布局。當 Table 或其祖先元素由隱藏切換為顯示時,可能需要調用此方法 | — |
sort | 手動對 Table 進行排序。參數prop 屬性指定排序列,order 指定排序順序。 | prop: string, order: string |
參數 | 說明 | 類型 | 可選值 | 默認值 |
---|---|---|---|---|
type | 對應列的類型。如果設置了 selection 則顯示多選框;如果設置了 index 則顯示該行的索引(從 1 開始計算);如果設置了 expand 則顯示為一個可展開的按鈕 | string | selection/index/expand/handler | — |
index | 如果設置了 type=index ,可以通過傳遞 index 屬性來自定義索引 | number, Function(index) | - | - |
column-key | column 的 key,如果需要使用 filter-change 事件,則需要此屬性標識是哪個 column 的篩選條件 | string | — | — |
label | 顯示的標題 | string | — | — |
prop | 對應列內容的字段名,也可以使用 property 屬性 | string | — | — |
width | 對應列的寬度 | string | — | — |
min-width | 對應列的最小寬度,與 width 的區別是 width 是固定的,min-width 會把剩余寬度按比例分配給設置了 min-width 的列 | string | — | — |
fixed | 列是否固定在左側或者右側,true 表示固定在左側 | string, boolean | true, left, right | — |
render-header | 列標題 Label 區域渲染使用的 Function | Function(h, { column, $index }) | — | — |
sortable | 對應列是否可以排序,如果設置為 'custom',則代表用戶希望遠程排序,需要監聽 Table 的 sort-change 事件 | boolean, string | true, false, 'custom' | false |
sort-method | 對數據進行排序的時候使用的方法,僅當 sortable 設置為 true 的時候有效,需返回一個數字,和 Array.sort 表現一致 | Function(a, b) | — | — |
sort-by | 指定數據按照哪個屬性進行排序,僅當 sortable 設置為 true 且沒有設置 sort-method 的時候有效。如果 sort-by 為數組,則先按照第 1 個屬性排序,如果第 1 個相等,再按照第 2 個排序,以此類推 | String/Array/Function(row, index) | — | — |
sort-orders | 數據在排序時所使用排序策略的輪轉順序,僅當 sortable 為 true 時有效。需傳入一個數組,隨著用戶點擊表頭,該列依次按照數組中元素的順序進行排序 | array | 數組中的元素需為以下三者之一:ascending 表示升序,descending 表示降序,null 表示還原為原始順序 | ['ascending', 'descending', null] |
resizable | 對應列是否可以通過拖動改變寬度(需要在 el-table 上設置 border 屬性為真) | boolean | — | true |
formatter | 用來格式化內容 | Function(row, column, cellValue, index) | — | — |
show-overflow-tooltip | 當內容過長被隱藏時顯示 tooltip | Boolean | — | false |
align | 對齊方式 | String | left/center/right | left |
header-align | 表頭對齊方式,若不設置該項,則使用表格的對齊方式 | String | left/center/right | — |
class-name | 列的 className | string | — | — |
label-class-name | 當前列標題的自定義類名 | string | — | — |
selectable | 僅對 type=selection 的列有效,類型為 Function,Function 的返回值用來決定這一行的 CheckBox 是否可以勾選 | Function(row, index) | — | — |
reserve-selection | 僅對 type=selection 的列有效,類型為 Boolean,為 true 則會在數據更新之后保留之前選中的數據(需指定 row-key ) | Boolean | — | false |
filters | 數據過濾的選項,數組格式,數組中的元素需要有 text 和 value 屬性。 | Array[{ text, value }] | — | — |
filter-placement | 過濾彈出框的定位 | String | 與 Tooltip 的 placement 屬性相同 | — |
filter-multiple | 數據過濾的選項是否多選 | Boolean | — | true |
filter-method | 數據過濾使用的方法,如果是多選的篩選項,對每一條數據會執行多次,任意一次返回 true 就會顯示。 | Function(value, row, column) | — | — |
filtered-value | 選中的數據過濾項,如果需要自定義表頭過濾的渲染方式,可能會需要此屬性。 | Array | — | — |
-分割線- | --- | --- | --- | --- |
slotHeaderName | 自定義表頭插槽名字 | string | - | - |
參數 | 說明 | 類型 | 可選值 | 默認值 |
---|---|---|---|---|
key | 根據key 合并 | string | - | - |
propList | 需要合并的prop或者property 的key值 | array | [] | |
children | 平鋪轉換列表對應的key,傳children內部會幫轉換,否則需要自己轉換 | string | — | children |
自定義列的顯示內容,可組合其他組件使用。
:::demo 通過 Scoped slot 可以獲取到 row, column, $index 和 store(table 內部的狀態管理)的數據,用法參考 demo。
<div> <d-table-plus :columns="columns" :data="tableData"> <template #date="{row}"> <i class="el-icon-time"></i> <span >{{ row.date }}</span> </template> <template #handler="{ row }"> <el-button type="text" size="small" @click="handlerAdd(row)" >新增</el-button > <el-button type="text" size="small">編輯</el-button> </template> </d-table-plus> </div> <script> export default { data() { return { columns: [ { label: '日期', prop: 'date', align: 'center', slotName: 'date', }, { label: '姓名', width: '100px', prop: 'name', required: true, align: 'center', formatter: (row) => `${row.name}1111`, }, { label: '省份', prop: 'province', }, { label: '市區', prop: 'city', }, { label: '地址', prop: 'address', showOverflowTooltip: true, }, { label: '操作', type: 'handler', width: '150px', fixed: 'right', slotName: 'handler', }, ], tableData: [ { date: '2016-05-02', name: '王小虎', province: '上海', city: '普陀區', address: '上海市普陀區金沙江路 1518 弄', zip: 200333, }, { date: '2016-05-04', name: '王小虎', province: '上海', city: '普陀區', address: '上海市普陀區金沙江路 1517 弄', zip: 200333, }, { date: '2016-05-01', name: '王小虎', province: '上海', city: '普陀區', address: '上海市普陀區金沙江路 1519 弄', zip: 200333, }, { date: '2016-05-03', name: '王小虎', province: '上海', city: '普陀區', address: '上海市普陀區金沙江路 1516 弄', zip: 200333, }, ], }; }, }; </script>
以上就是“vue怎么實現table-plus組件”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。