使用elementUI table展开行内嵌套table问题

 更新时间:2023年04月18日 14:49:35   作者:知所云  
这篇文章主要介绍了使用elementUI table展开行内嵌套table问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

elementUI table展开行内嵌套table

需求

产品需要table展开行内嵌套一个可以翻页的table,emmm·····我也不知道她咋想的,那么需要就得试下呀

使用 vue + elementUI

首先,elementui提供了table展开行的一个功能,那么就在这个功能上改造就好了,如果实现的不算特别好,别打我

上代码

<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: '荷兰优质淡奶,奶香浓而不腻',
          address: '上海市普陀区真北路',
          shop: '王小虎夫妻店',
          shopId: '10333'
        }, {
          id: '12987123',
          name: '好滋好味鸡蛋仔',
          category: '江浙小吃、小吃零食',
          desc: '荷兰优质淡奶,奶香浓而不腻',
          address: '上海市普陀区真北路',
          shop: '王小虎夫妻店',
          shopId: '10333'
        }, {
          id: '12987125',
          name: '好滋好味鸡蛋仔',
          category: '江浙小吃、小吃零食',
          desc: '荷兰优质淡奶,奶香浓而不腻',
          address: '上海市普陀区真北路',
          shop: '王小虎夫妻店',
          shopId: '10333'
        }, {
          id: '12987126',
          name: '好滋好味鸡蛋仔',
          category: '江浙小吃、小吃零食',
          desc: '荷兰优质淡奶,奶香浓而不腻',
          address: '上海市普陀区真北路',
          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是展开行内放的table,正常些就好了,但是遇到的问题是,这个点展开的时候table里面的数据是动态获取的,刚开始直接定义的是tableData是直接等于动态获取的值(:tableData=“tableData” 这🐏样子的),但是数据有,页面却不更新,很多方法试了都不行,emmmm。。。。

有点坑,然后看提供的是从scope.row的children获取数据的,所以接口获取数据之后set进这个row的children内就可以实现了,但是前提要获取这个行所在的index,刚好这边需求是展开后其他展开行要收起,所以两个结合一下就能实现了

<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"> //     当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 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数据
      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中可能会红线报错,但不影响正常效果

    <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.因为嵌套表格的数据是动态获取的,所以要保证每次只能展开一行,展开多行会出现每个展开行的表格数据都是一样的bug

实现每次只能展开一行,给外层表格添加如下属性

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:{
        //展开行选项变化时触发
        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
            })
        },
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue动态组件 component :is的使用代码示范

    Vue动态组件 component :is的使用代码示范

    vue 动态组件用于实现在指定位置上,动态加载不同的组件,这篇文章主要介绍了Vue动态组件 component :is的使用,需要的朋友可以参考下
    2023-09-09
  • vue3使用useDialog实现对话框的示例代码

    vue3使用useDialog实现对话框的示例代码

    在日常开发中,弹窗是常见的一个功能,本文主要介绍了vue3使用useDialog实现对话框的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 去除element-ui下拉框的下拉箭头的实现

    去除element-ui下拉框的下拉箭头的实现

    我们最开始拿到的element-ui是带有下拉箭头的,那么如何去除element-ui下拉框的下拉箭头的实现,本文就详细的介绍一下,感兴趣的可以了解一下
    2023-08-08
  • Vue渲染流程步骤详解

    Vue渲染流程步骤详解

    在Vue里渲染一块内容,会有四个流程步骤,那么该怎么理解这个流程呢,所以本文就给大家详细讲解一下Vue 渲染流程,文中有纤细的代码示例供大家参考,需要的朋友可以参考下
    2023-07-07
  • 前端Vue.js实现json数据导出到doc

    前端Vue.js实现json数据导出到doc

    这篇文章主要介绍了前端Vue.js实现json数据导出到doc,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解

    Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解

    这篇文章主要介绍了Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能,结合实例形式详细分析了Vue + Node.js + MongoDB基于图片上传组件实现图片预览和删除功能相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • vue项目接口域名动态获取操作

    vue项目接口域名动态获取操作

    这篇文章主要介绍了vue项目接口域名动态获取操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue中jsonp插件的使用方法示例

    vue中jsonp插件的使用方法示例

    这篇文章主要给大家介绍了关于vue中jsonp插件的使用方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • vue-element-admin搭建后台管理系统的实现步骤

    vue-element-admin搭建后台管理系统的实现步骤

    本文主要介绍了vue-element-admin搭建后台管理系统的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 浅谈vue-router2路由参数注意的问题

    浅谈vue-router2路由参数注意的问题

    下面小编就为大家带来一篇浅谈vue-router2路由参数注意的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论