LZM

el-table中的el-switch切换状态前执行异步请求且独立控制loading效果

2024-11-06 10:59:45

在前端开发中,我们常常需要在表格中的每一行添加 el-switch 控件,并在切换时执行异步操作(如 API 请求)。为了提升用户体验,我们希望每行的开关独立显示加载动画,并且通过 before-change 事件带上行数据参数来处理异步请求。

解决方案概述

我们需要在 el-table 中为每一行添加 el-switch,并使用 before-change 事件处理每行的切换逻辑。通过带上 scope.row 作为参数,在异步操作中使用该参数来获取当前行的 ID 或其他数据,以便进行后续的操作。

判断加载状态
:loading="switchLoading === scope.row.id"
带参数的 before-change
:before-change="beforeChange.bind(this, scope.row)"

示例代码如下:
Vue 复制代码
<template>
    <el-table :data="tableData">
        <el-table-column label="ID" prop="id"></el-table-column>
        <el-table-column label="Status">
            <template #default="scope">
                <!-- 每行的 el-switch 控件  带参数的 before-change -->
                <el-switch v-model="scope.row.status" :loading="switchLoading === scope.row.id" :before-change="beforeChange.bind(this, scope.row)"> </el-switch>
            </template>
        </el-table-column>
    </el-table>
</template>

<script setup>
import { ref } from "vue";

// 表格数据
const tableData = ref([
    { id: 1, status: true },
    { id: 2, status: false },
    { id: 3, status: true },
]);

// 控制加载状态的变量
const switchLoading = ref("");

// 模拟 API 请求
const changeArticleStatus = async (id) => {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve({ code: 200 }); // 模拟成功响应
        }, 2000);
    });
};

// before-change 事件处理函数
const beforeChange = (row) => {
    return new Promise(async (resolve, reject) => {
        switchLoading.value = row.id; // 设置当前行的加载状态
        const result = await changeArticleStatus(row.id); // 执行异步请求
        switchLoading.value = ""; // 请求完成后清除加载状态

        // 根据请求结果决定是否切换开关
        if (result.code === 200) {
            resolve(true); // 请求成功,允许切换
        } else {
            reject(false); // 请求失败,阻止切换
        }
    });
};
</script>

总结

通过 before-change 事件带参数和 switchLoading 控制,我们可以轻松实现每行的 el-switch 独立加载效果,并在切换状态前执行异步操作。这样,不仅提升了用户体验,还确保了每行状态切换的准确性和独立性。

End