温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用elementUI table展开行内嵌套table问题怎么解决

发布时间:2023-04-18 15:29:05 来源:亿速云 阅读:120 作者:iii 栏目:开发技术

这篇“使用elementUI table展开行内嵌套table问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“使用elementUI table展开行内嵌套table问题怎么解决”文章吧。

    elementUI table展开行内嵌套table

    需求

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

    使用 vue + elementUI

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

    上代码

    <template>
      <el-table
        :data="tableData"
        >
        <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
                })
            },
        }
    }

    以上就是关于“使用elementUI table展开行内嵌套table问题怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI