今天小編給大家分享一下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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。