elementUI table展开行内嵌套table
需求
产品需要table展开行内嵌套一个可以翻页的table,emmm·····我也不知道她咋想的,那么需要就得试下呀
使用 vue + elementUI
首先,elementui提供了table展开行的一个功能,那么就在这个功能上改造就好了,如果实现的不算特别好,别打我
上代码
{{ props.row.name }} {{ props.row.shop }} {{ props.row.id }} {{ props.row.shopId }} {{ props.row.category }} {{ props.row.address }} {{ props.row.desc }}
这个是elementui提供的,那么需要改造el-table-column type=“expand”
代码如下
tableList是展开行内放的table,正常些就好了,但是遇到的问题是,这个点展开的时候table里面的数据是动态获取的,刚开始直接定义的是tableData是直接等于动态获取的值(:tableData=“tableData” 这样子的),但是数据有,页面却不更新,很多方法试了都不行,emmmm。。。。
有点坑,然后看提供的是从scope.row的children获取数据的,所以接口获取数据之后set进这个row的children内就可以实现了,但是前提要获取这个行所在的index,刚好这边需求是展开后其他展开行要收起,所以两个结合一下就能实现了
// 当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 expanded)
js代码
data() { return { pageInfo:{ total:0, pageNo:1, pageSize:5 }, expands: [] , list: [], // table数据 getRowKeys(row) { // 行数据的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值,在展开请求数据后set进row的children this.pageInfo.pageNo = 1 this.queryBigDataOutList() // 接口请求的方法 } }, }
到这里差不多就完成了,但是在点击内部table翻页的时候数据更新会出现问题,所以给tableList设置了v-if这样数据就可以实时更新渲染页面了,因为接口请求反应会比较慢,所以加了一个v-loading.fullscreen.lock="loading"加载
elementui展开行踩过的坑
项目需求使用展开行实现表格嵌套,且要根据当前点击的行来动态获取展开行中的数据
总结一下踩过的坑
1.展开行中的表格data绑定的必须是外层表格中的数据的子项,否则会出现第一次点击展开嵌套表格不显示,点击两次才会显示的bug
export default { data(){ return{ tableData:[{ //外层绑定的data name:'xiaoming', age:'18', rowData:[], //展开行表格绑定的data }], } }, }
但是这个方法需要每次点击的时候获取到当前点击行的index,并异步请求获取数据添加到外层表格绑定的data中,这样有些麻烦,我想单独定义一个变量来绑定嵌套的表格
get到一个不是太好的解决方法,在展开行的tem中加上slot-scope=“scope”,但下面不用使用这个scope,vscode中可能会红线报错,但不影响正常效果
//这里scope会报错 export default { data(){ return{ tableData:[], //外层绑定的data rowData:[], //展开行表格绑定的data } }, }...
2.因为嵌套表格的数据是动态获取的,所以要保证每次只能展开一行,展开多行会出现每个展开行的表格数据都是一样的bug
实现每次只能展开一行,给外层表格添加如下属性
tem
...
js:
export default { data(){ return{ tableData:[], //外层绑定的data rowData:[], //展开行表格绑定的data expands: [], getRowKeys (row) { return row.id }, } }, methods:{ //展开行选项变化时触发 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({ //发送异步请求获取嵌套表格数据 ··· }).then(({data})=>{ this.rowData = data.list }) }, } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。