表格展开行使用v-loading加载状态问题?

表格展开行内在再嵌套一个表格,子表格使用v-loading绑定了一个加载状态,理想结果是外表格点击一行展开子表格,子表格v-loading=true遮罩一层加载状态,异步请求数据完成后对v-loading绑定的状态取反,关闭遮罩并加载数据。

<el-table :data="tableData" @expand-change="expandCallback" :default-sort="{ prop: 'absence', order: 'descending' }"
            size="large" :border="false" v-loading="loading" class="table">
            <el-table-column type="expand" label="详情" width="60">
                <template #default="props">
                    <el-table :data="props.row.sub" v-loading="props.row.subLoading">
                        <el-table-column align="center" label="员工姓名"></el-table-column>
                        <el-table-column align="center" label="员工姓名"></el-table-column>
                        <el-table-column align="center" label="员工姓名"></el-table-column>
                    </el-table>
                </template>
            </el-table-column>
            <el-table-column prop="staffId" label="工号" width="150" align="center"></el-table-column>
            <el-table-column prop="staffName" width="150" align="center" label="员工姓名"></el-table-column>
            <el-table-column prop="departmentName" width="150" align="center" label="部门"></el-table-column>
            <el-table-column prop="signIn" sortable min-width="100" align="center" label="正常天数"></el-table-column>
            <el-table-column prop="late" align="center" min-width="100" label="迟到天数"></el-table-column>
            <el-table-column prop="leaveEarly" align="center" min-width="100" label="早退天数"></el-table-column>
            <el-table-column prop="absence" sortable align="center" min-width="100" label="缺勤天数"></el-table-column>
        </el-table>

关键是只要一改变任意行的子表格的v-loading绑定的值就会导致2个问题:
(1)加载状态一切换就会导致事先排序好的表格重排(表格刷新了?)
(2)所有展开的行都被关闭

interface expandSet {
    id: number;
    staffName: string;
    staffId: string;
    attendanceTime: string;
    attendanceState: number;
}

interface TableItem {
    staffId: string;
    staffName: string;
    departmentName: string;
    departmentId: number;
    signIn: number;
    late: number;
    leaveEarly: number;
    absence: number;
    subLoading: boolean;//v-loading双向绑定值
    sub: expandSet[];
}
//展开行回调
function expandCallback(row: any, expandedRows: any) {
    setTimeout(() => {
        row.subLoading = false;
    }, 5000);
}

// onMounted会调用该方法
const getData = (startTime: string = query.queryTime[0], endTime: string = query.queryTime[1], departmentId: number = null, staffName: string = null) => {
    findAttendanceToTime(startTime, endTime, departmentId, staffName).then((res) => {
        if (res.data.code === 1000) {
            tableData.value = res.data.data;
            tableData.value.forEach(item => {
                item.sub = [];
                item.subLoading = true; //这里对subLoading初始化
            });
            loading.value = false;
        } else {
            loading.value = false;
            ElMessage.warning(permiss.getError(res));
        }
    }).catch((err) => {
        loading.value = false;
        ElMessage.error(permiss.getError(err));
    })
};
阅读 2.8k
1 个回答
新手上路,请多包涵

问题解决了,原因如果表格数据(见内容tableData)是用赋值的方式添加,排序会失效,可能是同步异步问题,建议使用push添加数据,第二个展开行问题,最好先将展开行内容添加好,用个空的占位数据也行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题