亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue怎么實現table-plus組件

發布時間:2022-04-12 17:37:31 來源:億速云 閱讀:370 作者:zzz 欄目:開發技術

今天小編給大家分享一下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>

    文檔

    TablePlus Attributes

    參數說明類型可選值默認值
    data顯示的數據array&mdash;&mdash;
    heightTable 的高度,默認為自動高度。如果 height 為 number 類型,單位 px;如果 height 為 string 類型,則這個高度會設置為 Table 的 style.height 的值,Table 的高度會受控于外部樣式。string/number&mdash;&mdash;
    max-heightTable 的最大高度。合法的值為數字或者單位為 px 的高度。string/number&mdash;&mdash;
    stripe是否為斑馬紋 tableboolean&mdash;false
    border是否帶有縱向邊框boolean&mdash;false
    sizeTable 的尺寸stringmedium / small / mini&mdash;
    fit列的寬度是否自撐開boolean&mdash;true
    show-header是否顯示表頭boolean&mdash;true
    highlight-current-row是否要高亮當前行boolean&mdash;false
    current-row-key當前行的 key,只寫屬性String,Number&mdash;&mdash;
    row-class-name行的 className 的回調方法,也可以使用字符串為所有行設置一個固定的 className。Function({row, rowIndex})/String&mdash;&mdash;
    row-style行的 style 的回調方法,也可以使用一個固定的 Object 為所有行設置一樣的 Style。Function({row, rowIndex})/Object&mdash;&mdash;
    cell-class-name單元格的 className 的回調方法,也可以使用字符串為所有單元格設置一個固定的 className。Function({row, column, rowIndex, columnIndex})/String&mdash;&mdash;
    cell-style單元格的 style 的回調方法,也可以使用一個固定的 Object 為所有單元格設置一樣的 Style。Function({row, column, rowIndex, columnIndex})/Object&mdash;&mdash;
    header-row-class-name表頭行的 className 的回調方法,也可以使用字符串為所有表頭行設置一個固定的 className。Function({row, rowIndex})/String&mdash;&mdash;
    header-row-style表頭行的 style 的回調方法,也可以使用一個固定的 Object 為所有表頭行設置一樣的 Style。Function({row, rowIndex})/Object&mdash;&mdash;
    header-cell-class-name表頭單元格的 className 的回調方法,也可以使用字符串為所有表頭單元格設置一個固定的 className。Function({row, column, rowIndex, columnIndex})/String&mdash;&mdash;
    header-cell-style表頭單元格的 style 的回調方法,也可以使用一個固定的 Object 為所有表頭單元格設置一樣的 Style。Function({row, column, rowIndex, columnIndex})/Object&mdash;&mdash;
    row-key行數據的 Key,用來優化 Table 的渲染;在使用 reserve-selection 功能與顯示樹形數據時,該屬性是必填的。類型為 String 時,支持多層訪問:user.info.id,但不支持 user.info[0].id,此種情況請使用 FunctionFunction(row)/String&mdash;&mdash;
    empty-text空數據時顯示的文本內容,也可以通過 slot="empty" 設置String&mdash;暫無數據
    default-expand-all是否默認展開所有行,當 Table 包含展開行存在或者為樹形表格時有效Boolean&mdash;false
    expand-row-keys可以通過該屬性設置 Table 目前的展開行,需要設置 row-key 屬性才能使用,該屬性為展開行的 keys 數組。Array&mdash; 
    default-sort默認的排序列的 prop 和順序。它的prop屬性指定默認的排序的列,order指定默認排序的順序Objectorder: ascending, descending如果只指定了prop, 沒有指定order, 則默認順序是ascending
    tooltip-effecttooltip effect 屬性Stringdark/light 
    show-summary是否在表尾顯示合計行Boolean&mdash;false
    sum-text合計行第一列的文本String&mdash;合計
    summary-method自定義的合計計算方法Function({ columns, data })&mdash;&mdash;
    span-method合并行或列的計算方法Function({ row, column, rowIndex, columnIndex })&mdash;&mdash;
    select-on-indeterminate在多選表格中,當僅有部分行被選中時,點擊表頭的多選框時的行為。若為 true,則選中所有行;若為 false,則取消選擇所有行Boolean&mdash;true
    indent展示樹形數據時,樹節點的縮進Number&mdash;16
    lazy是否懶加載子節點數據Boolean&mdash;&mdash;
    load加載子節點數據的函數,lazy 為 true 時生效,函數第二個參數包含了節點的層級信息Function(row, treeNode, resolve)&mdash;&mdash;
    tree-props渲染嵌套數據的配置選項Object&mdash;{ hasChildren: 'hasChildren', children: 'children' }
    -分割線-------------
    columns列表配置arraycolumn[]
    spanConfig合并表格配置objectspanConfig[]
    slotName自定義插槽名字string--

    TablePlus Events

    事件名說明參數
    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)

    TablePlus Methods

    方法名說明參數
    clearSelection用于多選表格,清空用戶的選擇&mdash;
    toggleRowSelection用于多選表格,切換某一行的選中狀態,如果使用了第二個參數,則是設置這一行選中與否(selected 為 true 則選中)row, selected
    toggleAllSelection用于多選表格,切換所有行的選中狀態-
    toggleRowExpansion用于可展開表格與樹形表格,切換某一行的展開狀態,如果使用了第二個參數,則是設置這一行展開與否(expanded 為 true 則展開)row, expanded
    setCurrentRow用于單選表格,設定某一行為選中行,如果調用時不加參數,則會取消目前高亮行的選中狀態。row
    clearSort用于清空排序條件,數據會恢復成未排序的狀態&mdash;
    clearFilter不傳入參數時用于清空所有過濾條件,數據會恢復成未過濾的狀態,也可傳入由columnKey組成的數組以清除指定列的過濾條件columnKey
    doLayout對 Table 進行重新布局。當 Table 或其祖先元素由隱藏切換為顯示時,可能需要調用此方法&mdash;
    sort手動對 Table 進行排序。參數prop屬性指定排序列,order指定排序順序。prop: string, order: string

    TablePlus column

    參數說明類型可選值默認值
    type對應列的類型。如果設置了 selection 則顯示多選框;如果設置了 index 則顯示該行的索引(從 1 開始計算);如果設置了 expand 則顯示為一個可展開的按鈕stringselection/index/expand/handler&mdash;
    index如果設置了 type=index,可以通過傳遞 index 屬性來自定義索引number, Function(index)--
    column-keycolumn 的 key,如果需要使用 filter-change 事件,則需要此屬性標識是哪個 column 的篩選條件string&mdash;&mdash;
    label顯示的標題string&mdash;&mdash;
    prop對應列內容的字段名,也可以使用 property 屬性string&mdash;&mdash;
    width對應列的寬度string&mdash;&mdash;
    min-width對應列的最小寬度,與 width 的區別是 width 是固定的,min-width 會把剩余寬度按比例分配給設置了 min-width 的列string&mdash;&mdash;
    fixed列是否固定在左側或者右側,true 表示固定在左側string, booleantrue, left, right&mdash;
    render-header列標題 Label 區域渲染使用的 FunctionFunction(h, { column, $index })&mdash;&mdash;
    sortable對應列是否可以排序,如果設置為 'custom',則代表用戶希望遠程排序,需要監聽 Table 的 sort-change 事件boolean, stringtrue, false, 'custom'false
    sort-method對數據進行排序的時候使用的方法,僅當 sortable 設置為 true 的時候有效,需返回一個數字,和 Array.sort 表現一致Function(a, b)&mdash;&mdash;
    sort-by指定數據按照哪個屬性進行排序,僅當 sortable 設置為 true 且沒有設置 sort-method 的時候有效。如果 sort-by 為數組,則先按照第 1 個屬性排序,如果第 1 個相等,再按照第 2 個排序,以此類推String/Array/Function(row, index)&mdash;&mdash;
    sort-orders數據在排序時所使用排序策略的輪轉順序,僅當 sortable 為 true 時有效。需傳入一個數組,隨著用戶點擊表頭,該列依次按照數組中元素的順序進行排序array數組中的元素需為以下三者之一:ascending 表示升序,descending 表示降序,null 表示還原為原始順序['ascending', 'descending', null]
    resizable對應列是否可以通過拖動改變寬度(需要在 el-table 上設置 border 屬性為真)boolean&mdash;true
    formatter用來格式化內容Function(row, column, cellValue, index)&mdash;&mdash;
    show-overflow-tooltip當內容過長被隱藏時顯示 tooltipBoolean&mdash;false
    align對齊方式Stringleft/center/rightleft
    header-align表頭對齊方式,若不設置該項,則使用表格的對齊方式Stringleft/center/right&mdash;
    class-name列的 classNamestring&mdash;&mdash;
    label-class-name當前列標題的自定義類名string&mdash;&mdash;
    selectable僅對 type=selection 的列有效,類型為 Function,Function 的返回值用來決定這一行的 CheckBox 是否可以勾選Function(row, index)&mdash;&mdash;
    reserve-selection僅對 type=selection 的列有效,類型為 Boolean,為 true 則會在數據更新之后保留之前選中的數據(需指定 row-keyBoolean&mdash;false
    filters數據過濾的選項,數組格式,數組中的元素需要有 text 和 value 屬性。Array[{ text, value }]&mdash;&mdash;
    filter-placement過濾彈出框的定位String與 Tooltip 的 placement 屬性相同&mdash;
    filter-multiple數據過濾的選項是否多選Boolean&mdash;true
    filter-method數據過濾使用的方法,如果是多選的篩選項,對每一條數據會執行多次,任意一次返回 true 就會顯示。Function(value, row, column)&mdash;&mdash;
    filtered-value選中的數據過濾項,如果需要自定義表頭過濾的渲染方式,可能會需要此屬性。Array&mdash;&mdash;
    -分割線-------------
    slotHeaderName自定義表頭插槽名字string--

    TablePlus spanConfig

    參數說明類型可選值默認值
    key根據key 合并string--
    propList需要合并的prop或者property 的key值array[] 
    children平鋪轉換列表對應的key,傳children內部會幫轉換,否則需要自己轉換string&mdash;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組件”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    vue
    AI

    从江县| 北碚区| 金昌市| 莱阳市| 罗山县| 凤凰县| 横峰县| 丰台区| 隆子县| 汶上县| 贵德县| 新郑市| 吐鲁番市| 延寿县| 武胜县| 三江| 东港市| 青阳县| 吉安县| 翁源县| 晴隆县| 双流县| 连州市| 峡江县| 东至县| 神池县| 张北县| 石泉县| 卫辉市| 西乌珠穆沁旗| 平和县| 密云县| 庆阳市| 民权县| 任丘市| 清新县| 将乐县| 乌恰县| 东至县| 南丹县| 馆陶县|