Element實(shí)現(xiàn)表格嵌套、多個(gè)表格共用一個(gè)表頭的方法
一、分析需求
這里先上一張圖說明 需求 :
根據(jù)后端返回的數(shù)據(jù) ( res 是一個(gè)數(shù)組,它的元素是一個(gè)對象,對象里面的 ext
屬性是一個(gè)對象,它又包含了, default
、 free
和 pay
三個(gè)屬性,且這三個(gè)都是數(shù)組格式。):
渲染出一個(gè)這樣子的 表格
:
res
數(shù)據(jù):
res
的每一個(gè)元素的直接屬性 name
(即為郵費(fèi)模板名稱,比如成都運(yùn)費(fèi)模板),
res
的 ext
屬性下的三個(gè)數(shù)組 default
、 free
、 pay
,每一個(gè)數(shù)組要大的一行(這一行中,第一列是運(yùn)送到的地址的名字,這里定義的是 area
屬性,但后端是未給到這個(gè)字段的,可自己處理數(shù)據(jù)添加該字段 ,這里就不細(xì)說了。) 這個(gè) area
屬性占據(jù)的這一列,在頁面的展示效果 應(yīng)該是多行合并的效果。
二、代碼實(shí)現(xiàn):
<template> <div class="layout"> <el-table :data="res" > <el-table-column prop="name"> <template slot-scope="scope"> <div class="tab_header"> <span style="font-weight:600;">{{scope.row.name}}</span> <div class="operate"> <span @click="handleEdit(scope.$index, scope.row)">修改</span> <span @click="handleDelete(scope.$index, scope.row)">刪除</span> </div> </div> <!-- 這里要實(shí)現(xiàn) 多個(gè)表格共用一個(gè)表頭,故需做判斷,當(dāng)表格要渲染的數(shù)據(jù)為default這個(gè)數(shù)組的時(shí)候,才顯示表頭的label值 --> <!-- 注意:當(dāng)label無值的時(shí)候,還是會占用空間,故當(dāng)前表格在頁面上會出現(xiàn)一個(gè)代表表頭的空行,需要手動更改(重寫)Element表格的 thead樣式 --> <div v-for="item in (scope.row.ext)" :key="item.id"> <el-table :data="item" border :class="item!==scope.row.ext.default?'tab-thead-style':''" style="box-sizing: border-box;border-top:none;" :span-method="objectSpanMethod"> <el-table-column :label="item===scope.row.ext.default?'運(yùn)送到':''" prop="area"></el-table-column> <el-table-column :label="item===scope.row.ext.default?'首重':''" prop="weight"></el-table-column> <el-table-column :label="item===scope.row.ext.default?'運(yùn)費(fèi)':''" prop="first_price"></el-table-column> <el-table-column :label="item===scope.row.ext.default?'續(xù)重':''" prop="weight_incre"></el-table-column> <el-table-column :label="item===scope.row.ext.default?'最終運(yùn)費(fèi)':''" prop="extend_price"></el-table-column> </el-table> </div> </template> </el-table-column> </el-table> </div> </template> <script> export default { data () { return { // res 參考的是后端返回的數(shù)據(jù)格式, res: [ { id: 1, dealer_id: 0, name: '成都運(yùn)費(fèi)模板', type: 1, ext: { default: [{ area: '默認(rèn)', type: 1, region: '1', weight: '首重d', weight_incre: '續(xù)重d', first_price: '運(yùn)費(fèi)d', extend_price: '最終運(yùn)費(fèi)d' }], free: [{ area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '續(xù)重f', first_price: '運(yùn)費(fèi)f', extend_price: '最終運(yùn)費(fèi)f' }, { area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '續(xù)重f', first_price: '運(yùn)費(fèi)f', extend_price: '最終運(yùn)費(fèi)f' }], pay: [{ area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }] } }, { id: 2, dealer_id: 0, name: '重慶運(yùn)費(fèi)模板', type: 2, ext: { default: [{ area: '默認(rèn)1', type: 1, region: '1', weight: '首重d', weight_incre: '續(xù)重d', first_price: '運(yùn)費(fèi)d', extend_price: '最終運(yùn)費(fèi)d' }], free: [{ area: 'free1', type: 1, region: '1', weight: '首重f', weight_incre: '續(xù)重f', first_price: '運(yùn)費(fèi)f', extend_price: '最終運(yùn)費(fèi)f' }, { area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '續(xù)重f', first_price: '運(yùn)費(fèi)f', extend_price: '最終運(yùn)費(fèi)f' }], pay: [{ area: 'pay1', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay1', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '續(xù)重p', first_price: '運(yùn)費(fèi)p', extend_price: '最終運(yùn)費(fèi)p' }] } } ] } }, methods: { handleEdit (index, row) { console.log(index, row) }, handleDelete (index, row) { console.log(index, row) }, objectSpanMethod ({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { if (rowIndex === 0) { let maxLen this.res.forEach(val => { const arr = [val.ext.default.length, val.ext.free.length, val.ext.pay.length] arr.sort((a, b) => a - b)// arr數(shù)組 按數(shù)字大小從小到大排序 maxLen = arr.pop()// 取出排序后的數(shù)組arr中的最后一個(gè)元素 }) return { // 這個(gè)rowspan應(yīng)該據(jù) ext的default,pay,free的長度不同來定,取最大長度 rowspan: maxLen, colspan: 1 } } else { return { rowspan: 0, colspan: 0 } } } } } } </script> <style lang="scss"> .layout{ .tab_header{ color:#333; padding:0 5px 0 5px; height:45px; line-height:45px; border:1px solid #eee;display:flex; justify-content: space-between; background:rgb(233, 225, 225); } .operate{ span{ font-size: 14px; margin-right: 20px; margin-right:20px; color:#409EFF; cursor: pointer; } } /* 處理多個(gè)表格共用一個(gè)表頭時(shí),表頭處出現(xiàn)多余空行的問題 (label置空后還是占據(jù)空間問題) */ .tab-thead-style{ thead{ display: none; } } } </style>
三、知識點(diǎn)總結(jié):
為什么要采用這種方式解決(渲染)?
① . 項(xiàng)目用的UI組件是Element,它的Table表格組件,沒有直接處理行的操作。
② . el-table,它是通過注入data對象數(shù)組,并在el-table-column 中用prop屬性來對應(yīng)對象中的鍵名來填入數(shù)據(jù),從而渲染出渲染表格。其中el-table-column表示一個(gè)列,label屬性來定義表格的列名,即對象的一個(gè)鍵名代表一列;
③ . 沒想到更優(yōu)的解決辦法,O(∩_∩)O哈哈~
多個(gè)表格共用一個(gè)表頭時(shí),注意:
①. 需做判斷,同時(shí)注意label的值。
②. 當(dāng)el-table-column 的屬性label無值的時(shí)候,還是會占用空間,故當(dāng)前表格在頁面上會出現(xiàn)一個(gè)代表表頭的空行,需要手動更改(重寫)Element表格的 thead樣式
table表格嵌套的時(shí)候,注意:
① . Element的Table組件可 自定義列模板,主要是利用它實(shí)現(xiàn)表格嵌套部分,通過 Scoped slot 可以獲取到 row, column, $index 和 store(table 內(nèi)部的狀態(tài)管理)的數(shù)據(jù),更多用法參考官網(wǎng)。
②. Element的Table組件可 合并行或列 ,多行或多列共用一個(gè)數(shù)據(jù)時(shí),可以合并行或列;通過給table傳入span-method方法可以實(shí)現(xiàn)合并行或列,參考上述代碼的 **objectSpanMethod**方法(該表格的第一列需要合并多行——合并渲染表格的data數(shù)組的長度那么多行) 或者官網(wǎng)。
到此這篇關(guān)于Element實(shí)現(xiàn)表格嵌套、多個(gè)表格共用一個(gè)表頭的方法的文章就介紹到這了,更多相關(guān)Element 表格嵌套內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- el-element中el-table表格嵌套el-select實(shí)現(xiàn)動態(tài)選擇對應(yīng)值功能
- vue+element表格實(shí)現(xiàn)多層數(shù)據(jù)的嵌套方式
- Vue?elementUI表單嵌套表格并對每行進(jìn)行校驗(yàn)詳解
- 關(guān)于ElementPlus中的表單驗(yàn)證規(guī)則詳解
- ElementUI表單驗(yàn)證validate和validateField的使用及區(qū)別
- element表單驗(yàn)證如何清除校驗(yàn)提示語
- 解決vue+ element ui 表單驗(yàn)證有值但驗(yàn)證失敗問題
- element 表格嵌套表單驗(yàn)證指定行的操作方法
相關(guān)文章
Vue3中同時(shí)定義多個(gè)插槽的實(shí)現(xiàn)示例
本文主要介紹了Vue3中同時(shí)定義多個(gè)插槽的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12圖片預(yù)覽插件vue-photo-preview的使用示例詳解
這篇文章主要介紹了圖片預(yù)覽插件vue-photo-preview的使用,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08解決vue中修改export default中腳本報(bào)一大堆錯(cuò)的問題
今天小編就為大家分享一篇解決vue中修改export default中腳本報(bào)一大堆錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Vue3使用時(shí)應(yīng)避免的10個(gè)錯(cuò)誤總結(jié)
Vue?3已經(jīng)穩(wěn)定了相當(dāng)長一段時(shí)間了。許多代碼庫都在生產(chǎn)環(huán)境中使用它,其他人最終都將不得不遷移到Vue?3。我現(xiàn)在有機(jī)會使用它并記錄了我的錯(cuò)誤,下面這些錯(cuò)誤你可能想要避免2023-03-03vue實(shí)現(xiàn)導(dǎo)航欄效果(選中狀態(tài)刷新不消失)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)導(dǎo)航欄效果,選中狀態(tài)刷新不消失,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12