vue element ui 行展开加载表格,每次展开一行关闭其他行和展开多行

需求:有一个表格,要求行展开得到该行的详细数据,每行的详细数据字段不一致。

在网上搜了下,做完发现,展开某行数据时会把所有展开替换掉,是自己定义变量的问题,改完之后看了下到单行行展开,参考了大佬们的博客,这里不再过多赘述
vue-element el-table点击行展开,并且收起其他行_el-table展开一行 自动收起上一行-CSDN博客

但需求要求全部可展开,话不多说上代码
 

        <el-table ref="table" :height="height" stripe border v-loading="loading"  :data="tracedBackList"
//默认全部加载可不用row-key和expand-change事件
     row-key="pid" @expand-change="handleExpandChange">
            <el-table-column type="expand" >
                <template #default="props">
                    <div>
                        <el-table :data="props.row.children" ref="childTable" :border="childBorder" >
                            <el-table-column class="expanded-table-colum"
                                             v-for="(column, index) in props.row.computedColumns"
                                             :key="index"
                                             :label="column.label"
                                             :prop="column.prop"
                                             :width="column.minWidth"
                                             show-overflow-tooltip
                            />
                        </el-table>
                    </div>
                </template>
            </el-table-column>
            <el-table-column label="pid" align="center" prop="pid" v-if="false"/>


        </el-table>
    function getList() {
       
        getAllOperationData(请求参数).then(response => {
            if (200 == response.code) {
                const {data} = response;
                tracedBackList.length = 0;
                data.forEach(item=>{
                    item.children = [];
                    item.computedColumns = [];
                    tracedBackList.push(item);

                     // getDetailDataList(item);
                })
                total.value = response.data.length;
            }
        }).finally(() => {
            loading.value = false;
        });
    }

    function getDetailDataList (data){
        const param = {请求参数};
        getDetailData(param).then(response=>{
            if (200 == response.code) {
//默认全部加载

                <!-- data.children = response.data;
                data.computedColumns = Object.keys(response.data).map(key => ({ label: key, prop: key, minWidth:key.length > 5? key.length * 25:key.length * 40 }));
            -->
//单行点击加载
                data.children = [response.data];
                data.computedColumns = Object.keys(response.data).map(key => ({ label: key, prop: key, minWidth:key.length > 5? key.length * 25:key.length * 40 }));
            }
        }).finally(() => {
            loading.value = false;
        });
    }
//单行点击加载
  function handleExpandChange  (expandedRows, row, expanded) {
         getDetailDataList(expandedRows);

    };

以上分为两种,一种是在查询行数据时直接加载全部子数据,一种是每展开一行加载该行详细数据,本人较懒,没将两种代码分开展示,此稿只做笔记。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue展开加载表格,一种常见的做法是通过自定义组件来实现。具体步骤如下: 1. 在父组件中定义表格,并在需要展开中添加一个自定义组件,用于展示子表格。 2. 在自定义组件中定义子表格,并使用`props`接收父组件传递的数据,如当前的数据。可以使用`v-if`控制子表格的显示与隐藏。 3. 在父组件中定义一个方法,用于处理展开的事件。该方法需要接收当前的数据,并将其保存在一个数组中,用于渲染子表格。 4. 在父组件中定义一个计算属性,用于动态计算当前是否展开。可以使用`Array.prototype.includes()`方法判断当前的数据是否在保存数据的数组中,如果存在则返回`true`,否则返回`false`。 5. 在父组件中使用`scoped slot`自定义表格列,用于控制展开的显示。在展开中添加一个按钮或图标,用于触发展开的事件。 下面是一个简单的示例代码: ```html <template> <el-table :data="tableData"> <el-table-column type="expand"> <template slot-scope="props"> <child-table v-if="isExpanded(props.row)" :data="props.row"></child-table> </template> </el-table-column> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column> <template slot-scope="scope"> <el-button type="primary" size="small" @click="expandRow(scope.row)">Expand</el-button> </template> </el-table-column> </el-table> </template> <script> import ChildTable from './ChildTable.vue' export default { components: { ChildTable }, data() { return { tableData: [ { name: 'Alice', age: 22 }, { name: 'Bob', age: 30 }, { name: 'Charlie', age: 25 } ], expandedRows: [] } }, methods: { expandRow(row) { if (this.isExpanded(row)) { this.expandedRows = this.expandedRows.filter(item => item !== row) } else { this.expandedRows.push(row) } }, isExpanded(row) { return this.expandedRows.includes(row) } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值