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