点击switch开关后,出现弹窗确认后,显示loading效果

1. 实现表格中使用el-switch,改变el-switch状态前,需要出现一个弹窗进行确认。

一开始的写法出现了些问题,点击el-switch,出现弹窗的同时,开关的状态就已经改变了。
在这里插入图片描述

所以在网上搜了多方法,感觉都有些奇怪。
有些是建议不用v-model,使用value去绑定值(v-model双向绑定数据,数据发生变化时页面也会更新)。这种方法行的通,但是vue3+element plus中使用时,控制台会显示警告。如果用的版本比较低应该是没有问题的。
在这里插入图片描述

还用一种方法是先将el-swicth上添加disabled属性,防止在点击时状态发生变化,再出现弹窗。但是鼠标悬浮在el-switch上会出现禁止的符号,实际却能点击出现弹窗,感觉很奇怪。

经过一次次尝试,最后终于找到一个解决的方法!!

  1. HTML 关键代码
    <template #default="scope">
            <span v-if="col.key === 'enable'">
            //使用作用域插槽,这边使用Y和N控制,默认时true/false
              <el-switch
                v-model="scope.row.enable"
                active-value="Y"
                inactive-value="N"
                @change="handleChange(scope.row)" />
            </span>
     </template>
  1. JS 关键代码
// 点击el-switch后
async function handleChange(row) {
  try {
    const flag = row.enable; // 点击之后的值
    row.enable = row.enable === 'Y' ? 'N' : 'Y'; // switch点击前的状态
    const confirmTips = flag === 'Y' ? '开启' : '关闭';
    //确认框
    const confirm = await ElMessageBox.confirm(`确认${confirmTips}当前配置?`, '提示', {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    }).catch(() => false);
    if (!confirm) return false;
    // 确认后,进行网络请求
    const data = {
      id: row.id,
      enable: flag,
    };
    const res = await api.changeAlertFilter(data);
    if (!res.result) throw new Error(res?.message);
    ElMessage.success(res.message || '操作成功');
    // 刷新表格数据
    getAlertFilterList();
  } catch (error) {
    ElMessage.error(error);
    console.log(`[log] - handleChange - err`, error);
  }
}

2. el-switch请求接口时单独设置loading

一开始是在el-switch上添加loading绑定了一个变量, 但这样打开一个开关时,所有的都会加上loading。
正确写法:
获取到表格数据后给每条数据添加单独的loading变量,单独控制状态。

  1. HTML 关键代码
             <el-switch
                v-model="scope.row.enable"
                active-value="Y"
                inactive-value="N"
                @change="handleChange(scope.row)"
                :loading="scope.row.isSWitchLoading" />
  1. JS 关键代码
//获取表格列表数据
async function getAlertFilterList() {
  try {
    state.isTableLoading = true;
    const res = await api.getAlertFilterList();
    if (!res.result) throw new Error(res?.message);
    state.tableData = res?.objectList || [];
    // 给每条数据添加单独的loading变量,单独控制状态
    state.tableData.forEach((item) => {
      item.isSWitchLoading = false;//默认设为false
    });
  } catch (error) {
    state.tableData = [];
    ElMessage.error(error?.message);
    console.log(`[log] - getAlertFilterList - err`, error);
  } finally {
    state.isTableLoading = false;
  }
}
// 点击el-switch后
async function handleChange(row) {
  try {
    const flag = row.enable; // 点击之后的值
    row.enable = row.enable === 'Y' ? 'N' : 'Y'; // switch点击前的状态
    const confirmTips = flag === 'Y' ? '开启' : '关闭';
    const confirm = await ElMessageBox.confirm(`确认${confirmTips}当前配置?`, '提示', {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    }).catch(() => false);
    if (!confirm) return false;
   // 确认后,进行网络请求
    row.isSWitchLoading = true;//请求前开关显示loading效果
    const data = {
      id: row.id,
      enable: flag,
    };
    const res = await api.changeAlertFilter(data);
    if (!res.result) throw new Error(res?.message);
    ElMessage.success(res.message || '操作成功');
    getAlertFilterList();
  } catch (error) {
    ElMessage.error(error);
    console.log(`[log] - handleChange - err`, error);
  } finally {
    row.isSWitchLoading = false;//开关关闭loading效果
  }
}

点击switch开关后,出现弹窗确认后,显示loading效果
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现这个功能,你可以使用以下方法: 1. 在 el-switch 组件上添加一个点击事件,当用户点击开关时触发该事件; 2. 在事件处理函数中,弹出一个对话框,并将该开关的状态保存到一个变量中; 3. 在对话框中添加一个确定按钮,在用户点击确定按钮时,更新该开关的状态,并关闭对话框。在更新开关状态时,需要判断该开关之前的状态与当前状态是否一致,如果一致则不需要再次更新状态,否则会导致开关状态的错误变化。 以下是一个简单的示例代码(假设你在 Vue.js 框架中使用 el-switch 组件): ```html <template> <div> <el-switch v-model="switchValue" @change="handleSwitchChange"></el-switch> <el-dialog :visible="dialogVisible" @close="handleDialogClose"> <span slot="title">确认</span> <div>确定要改变开关状态吗?</div> <span slot="footer"> <el-button @click="handleDialogClose">取消</el-button> <el-button type="primary" @click="handleDialogConfirm">确定</el-button> </span> </el-dialog> </div> </template> <script> export default { data() { return { switchValue: false, dialogVisible: false, originalSwitchValue: false }; }, methods: { handleSwitchChange(value) { // 记录原始状态 this.originalSwitchValue = value; // 显示对话框 this.dialogVisible = true; }, handleDialogClose() { // 关闭对话框时,恢复原始状态 this.switchValue = this.originalSwitchValue; this.dialogVisible = false; }, handleDialogConfirm() { // 确认改变状态时,更新开关状态 this.dialogVisible = false; if (this.switchValue !== this.originalSwitchValue) { // 发送请求更新开关状态 // ... } } } }; </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值