使用elementUI table展開行內(nèi)嵌套table問題
elementUI table展開行內(nèi)嵌套table
需求
產(chǎn)品需要table展開行內(nèi)嵌套一個可以翻頁的table,emmm·····我也不知道她咋想的,那么需要就得試下呀
使用 vue + elementUI
首先,elementui提供了table展開行的一個功能,那么就在這個功能上改造就好了,如果實現(xiàn)的不算特別好,別打我
上代碼
<template> ? <el-table ? ? :data="tableData" ? ? style="width: 100%"> ? ? <el-table-column type="expand"> ? ? ? <template slot-scope="props"> ? ? ? ? <el-form label-position="left" inline class="demo-table-expand"> ? ? ? ? ? <el-form-item label="商品名稱"> ? ? ? ? ? ? <span>{{ props.row.name }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="所屬店鋪"> ? ? ? ? ? ? <span>{{ props.row.shop }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="商品 ID"> ? ? ? ? ? ? <span>{{ props.row.id }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="店鋪 ID"> ? ? ? ? ? ? <span>{{ props.row.shopId }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="商品分類"> ? ? ? ? ? ? <span>{{ props.row.category }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="店鋪地址"> ? ? ? ? ? ? <span>{{ props.row.address }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? ? <el-form-item label="商品描述"> ? ? ? ? ? ? <span>{{ props.row.desc }}</span> ? ? ? ? ? </el-form-item> ? ? ? ? </el-form> ? ? ? </template> ? ? </el-table-column> ? ? <el-table-column ? ? ? label="商品 ID" ? ? ? prop="id"> ? ? </el-table-column> ? ? <el-table-column ? ? ? label="商品名稱" ? ? ? prop="name"> ? ? </el-table-column> ? ? <el-table-column ? ? ? label="描述" ? ? ? prop="desc"> ? ? </el-table-column> ? </el-table> </template>
<style> ? .demo-table-expand { ? ? font-size: 0; ? } ? .demo-table-expand label { ? ? width: 90px; ? ? color: #99a9bf; ? } ? .demo-table-expand .el-form-item { ? ? margin-right: 0; ? ? margin-bottom: 0; ? ? width: 50%; ? } </style>
<script> ? export default { ? ? data() { ? ? ? return { ? ? ? ? tableData: [{ ? ? ? ? ? id: '12987122', ? ? ? ? ? name: '好滋好味雞蛋仔', ? ? ? ? ? category: '江浙小吃、小吃零食', ? ? ? ? ? desc: '荷蘭優(yōu)質(zhì)淡奶,奶香濃而不膩', ? ? ? ? ? address: '上海市普陀區(qū)真北路', ? ? ? ? ? shop: '王小虎夫妻店', ? ? ? ? ? shopId: '10333' ? ? ? ? }, { ? ? ? ? ? id: '12987123', ? ? ? ? ? name: '好滋好味雞蛋仔', ? ? ? ? ? category: '江浙小吃、小吃零食', ? ? ? ? ? desc: '荷蘭優(yōu)質(zhì)淡奶,奶香濃而不膩', ? ? ? ? ? address: '上海市普陀區(qū)真北路', ? ? ? ? ? shop: '王小虎夫妻店', ? ? ? ? ? shopId: '10333' ? ? ? ? }, { ? ? ? ? ? id: '12987125', ? ? ? ? ? name: '好滋好味雞蛋仔', ? ? ? ? ? category: '江浙小吃、小吃零食', ? ? ? ? ? desc: '荷蘭優(yōu)質(zhì)淡奶,奶香濃而不膩', ? ? ? ? ? address: '上海市普陀區(qū)真北路', ? ? ? ? ? shop: '王小虎夫妻店', ? ? ? ? ? shopId: '10333' ? ? ? ? }, { ? ? ? ? ? id: '12987126', ? ? ? ? ? name: '好滋好味雞蛋仔', ? ? ? ? ? category: '江浙小吃、小吃零食', ? ? ? ? ? desc: '荷蘭優(yōu)質(zhì)淡奶,奶香濃而不膩', ? ? ? ? ? address: '上海市普陀區(qū)真北路', ? ? ? ? ? shop: '王小虎夫妻店', ? ? ? ? ? shopId: '10333' ? ? ? ? }] ? ? ? } ? ? } ? } </script>
這個是elementui提供的,那么需要改造el-table-column type=“expand”
代碼如下
?<el-table-column fixed="right" align="center" label="操作" width="80" type="expand"> ? ? ? ? ? <template slot-scope="scope" ? v-loading.fullscreen.lock="loading"> ? ? ? ? ? ? <tableList :pageInfo='pageInfo' v-if="showTableData" :tableData="scope.row.children" @getListInfo="getListInfo" @currentChange='currentChangeTableList'></tableList> ? ? ? ? ? </template> ?</el-table-column>
tableList是展開行內(nèi)放的table,正常些就好了,但是遇到的問題是,這個點展開的時候table里面的數(shù)據(jù)是動態(tài)獲取的,剛開始直接定義的是tableData是直接等于動態(tài)獲取的值(:tableData=“tableData” 這??樣子的),但是數(shù)據(jù)有,頁面卻不更新,很多方法試了都不行,emmmm。。。。
有點坑,然后看提供的是從scope.row的children獲取數(shù)據(jù)的,所以接口獲取數(shù)據(jù)之后set進這個row的children內(nèi)就可以實現(xiàn)了,但是前提要獲取這個行所在的index,剛好這邊需求是展開后其他展開行要收起,所以兩個結(jié)合一下就能實現(xiàn)了
<el-table ? ? ? ? :data="list" ? ? ? ? stripe ? ? ? ? border ? ? ? ? size="small" ? ? ? ? :height="tableHeight" ? ? ? ? v-loading="loading" ? ? ? ? :row-key="getRowKeys" ? ? ? ? :expand-row-keys="expands" ? ? ? ? element-loading-text="拼命加載中" ? ? ? ? @expand-change="expandChange"> // ?? ?當用戶對某一行展開或者關(guān)閉的時候會觸發(fā)該事件(展開行時,回調(diào)的第二個參數(shù)為 expandedRows;樹形表格時第二參數(shù)為 expanded) ? ? ?? ? ? ? ? <el-table-column fixed="right" align="center" label="操作" width="80" type="expand"> ? ? ? ? ? <template slot-scope="scope" ? v-loading.fullscreen.lock="loading"> ? ? ? ? ? ? <tableList :pageInfo='pageInfo' v-if="showTableData" :tableData="scope.row.children" @getListInfo="getListInfo" @currentChange='currentChangeTableList'></tableList> ? ? ? ? ? </template> ? ? ? ? </el-table-column> ? ? ? </el-table>
js代碼
?data() { ? ? return { ? ? pageInfo:{ ? ? ? ? total:0, ? ? ? ? pageNo:1, ? ? ? ? pageSize:5 ? ? }, ? ? expands: [] , ? ? ? list: [], // table數(shù)據(jù) ? ? ? getRowKeys(row) { // 行數(shù)據(jù)的Key ? ? ? ? ?return row.vehID ? ? ? }, ?? ? }, ? methods:{ ? ?expandChange(row,expandedRows){ ? ? ? this.showTableData = false ? ? ? this.expands = [] ? ? ? if (expandedRows.length > 0) { ? ? ? ? ?row ? this.expands.push(row.vehID) : '' // 只展開一行 ? ? ? ? ?this.indexRow = this.list.indexOf(row) ?//獲取index值,在展開請求數(shù)據(jù)后set進row的children ? ? ? ? this.pageInfo.pageNo = 1 ? ? ? ? this.queryBigDataOutList() // 接口請求的方法 ? ? ? } ? ? }, ? }
到這里差不多就完成了,但是在點擊內(nèi)部table翻頁的時候數(shù)據(jù)更新會出現(xiàn)問題,所以給tableList設(shè)置了v-if這樣數(shù)據(jù)就可以實時更新渲染頁面了,因為接口請求反應(yīng)會比較慢,所以加了一個v-loading.fullscreen.lock="loading"加載
elementui展開行踩過的坑
項目需求使用展開行實現(xiàn)表格嵌套,且要根據(jù)當前點擊的行來動態(tài)獲取展開行中的數(shù)據(jù)
總結(jié)一下踩過的坑
1.展開行中的表格data綁定的必須是外層表格中的數(shù)據(jù)的子項,否則會出現(xiàn)第一次點擊展開嵌套表格不顯示,點擊兩次才會顯示的bug
export default { ? ? data(){ ? ? ? ? return{ ? ? ? ? ? ? tableData:[{ ? ? //外層綁定的data ? ? ? ? ? ? ?? ?name:'xiaoming', ? ? ? ? ? ? ?? ?age:'18', ? ? ? ? ? ? ?? ?rowData:[], ? ?//展開行表格綁定的data ? ? ? ? ? ? }], ? ? ? ? } ? ? }, }
但是這個方法需要每次點擊的時候獲取到當前點擊行的index,并異步請求獲取數(shù)據(jù)添加到外層表格綁定的data中,這樣有些麻煩,我想單獨定義一個變量來綁定嵌套的表格
get到一個不是太好的解決方法,在展開行的tem中加上slot-scope=“scope”,但下面不用使用這個scope,vscode中可能會紅線報錯,但不影響正常效果
? ? <el-table-column ? ? ?type="expand"> ? ? ? ? <template slot-scope="scope"> ? //這里scope會報錯 ? ? ? ? ?? ?<el-table? ? ? ? ? ?? ?:data="rowData"> ? ? ? ? ?? ??? ?... ? ? ? ? ?? ?</el-table> ? ? ? ? </template> ? ? </el-table-column> export default { ? ? data(){ ? ? ? ? return{ ? ? ? ? ? ? tableData:[], ? ?//外層綁定的data ? ? ? ? ? ? rowData:[], ? ?//展開行表格綁定的data ? ? ? ? } ? ? }, }
2.因為嵌套表格的數(shù)據(jù)是動態(tài)獲取的,所以要保證每次只能展開一行,展開多行會出現(xiàn)每個展開行的表格數(shù)據(jù)都是一樣的bug
實現(xiàn)每次只能展開一行,給外層表格添加如下屬性
tem
?? ?<el-table? ?? ??? ?:data="tableData" ?? ??? ?:row-key='getRowKeys' ?? ? ? ?? ?:expand-row-keys="expands" ?? ? ? ?? ?@expand-change="expandChange"> ?? ? ??? ??? ?... ??? ?</el-table>
js:
?? ?export default { ? ? data(){ ? ? ? ? return{ ? ? ? ? ? ? tableData:[], ? ?//外層綁定的data ? ? ? ? ? ? rowData:[], ? ?//展開行表格綁定的data ? ? ? ? ? ? expands: [], ? ? ? ? ? ? getRowKeys (row) { ? ? ? ? ? ? ? return row.id ? ? ? ? ? ? }, ? ? ? ? } ? ? }, ? ? ?methods:{ ?? ??? ?//展開行選項變化時觸發(fā) ? ? ? ? expandChange(row,expandedRows){ ? ? ? ? ? ? this.rowData = [] ? ? ? ? ? ? var that = this ? ? ? ? ? ? if (expandedRows.length) { ? ? ? ? ? ? ? that.expands = [] ? ? ? ? ? ? ? if (row) { ? ? ? ? ? ? ? ? that.expands.push(row.id) ? ? ? ? ? ? ? } ? ? ? ? ? ? } else { ? ? ? ? ? ? ? that.expands = [] ? ? ? ? ? ? } ? ? ? ? ? ? this.$http({ ? ?//發(fā)送異步請求獲取嵌套表格數(shù)據(jù) ? ? ? ? ? ? ? ? ··· ? ? ? ? ? ? }).then(({data})=>{ ? ? ? ? ? ? ? ? this.rowData = data.list ? ? ? ? ? ? }) ? ? ? ? }, ?? ?} }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- elementui?el-table底層背景色修改簡單方法
- 關(guān)于ElementUI el-table 鼠標滾動失靈的問題及解決辦法
- Vue+EleMentUI實現(xiàn)el-table-colum表格select下拉框可編輯功能實例
- elementUI中el-table表頭和內(nèi)容全部一行顯示完整的方法
- Vue?ElementUI在el-table中使用el-popover問題
- elementUI的table表格改變數(shù)據(jù)不更新問題解決
- 解決elementUI 切換tab后 el_table 固定列下方多了一條線問題
- elementui的table根據(jù)是否符合需求合并列的實現(xiàn)代碼
相關(guān)文章
vue+element-ui+axios多文件上傳的實現(xiàn)并顯示整體進度
這篇文章主要介紹了vue+element-ui+axios多文件上傳的實現(xiàn)并顯示整體進度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04vue跨域處理方式(vue項目中baseUrl設(shè)置問題)
這篇文章主要介紹了vue跨域處理方式(vue項目中baseUrl設(shè)置問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05