UniApp 多个异步开关控制教程

UniApp 多个异步开关控制教程(uView 1.0 / Vue2 版本)

📘 教程简介

本文介绍如何在 UniApp + uView1.0 + Vue2 中实现 多个异步控制的开关组件

每个开关可独立进行异步状态切换(例如调用后端接口),并在切换时显示加载状态。


🚀 效果演示

页面包含多个开关(如"设备1"、"设备2"...),用户点击切换时:

  1. 显示加载动画;
  2. 异步等待接口响应;
  3. 后端返回成功后更新状态。

🧩 完整示例代码

vue 复制代码
<template>
  <view class="switch-list">
    <view 
      class="switch-item" 
      v-for="(item, index) in switchList" 
      :key="item.id"
    >
      <text>{{ item.name }}</text>
      <u-switch
        :value="item.checked"
        :loading="item.loading"
        @change="onSwitchChange(index, $event)"
      ></u-switch>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      switchList: [
        { id: 1, name: '设备1', checked: true,  loading: false, controlStatus: false },
        { id: 2, name: '设备2', checked: false, loading: false, controlStatus: false },
        { id: 3, name: '设备3', checked: true,  loading: false, controlStatus: false }
      ]
    };
  },
  methods: {
    onSwitchChange(index, val) {
      const item = this.switchList[index];
      
      if (item.controlStatus) {
        item.controlStatus = false;
        return;
      }

      item.loading = true;
      item.controlStatus = true;
      item.checked = !val;

      this.getResultFromServer(index, val);
    },

    getResultFromServer(index, targetStatus) {
      const item = this.switchList[index];
      setTimeout(() => {
        item.loading = false;
        item.controlStatus = true;
        item.checked = targetStatus;
        uni.showToast({
          title: `开关【${item.name}】已${targetStatus ? '开启' : '关闭'}`,
          icon: 'none'
        });
      }, 1500);
    }
  }
};
</script>

<style scoped>
.switch-list {
  padding: 20rpx;
}
.switch-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 20rpx 0;
  border-bottom: 1px solid #eee;
}
</style>

🔧 接口调用替换

如需调用真实后端接口,将 setTimeout 替换为:

js 复制代码
uni.request({
  url: 'https://your.api/xxx',
  method: 'POST',
  data: { id: item.id, status: targetStatus },
  success: (res) => {
    item.loading = false;
    item.controlStatus = true;
    item.checked = targetStatus;
  },
  fail: () => {
    item.loading = false;
    item.controlStatus = false;
    uni.showToast({ title: '操作失败', icon: 'none' });
  }
});

✅ 教程总结

通过本示例,你可以:

  • 支持多个 u-switch 组件独立异步控制;
  • 使用 loading 状态防止重复点击;
  • 结合 controlStatus 避免循环触发;
  • 简单拓展为真实后端接口交互。

作者:ChatGPT(GPT-5)

更新时间:2025-11-08

相关推荐
OpenTiny社区23 分钟前
AI-Extension:让 AI 真的「看得到、动得了」你的浏览器
前端·ai编程·mcp
IT_陈寒25 分钟前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端
竹林8181 小时前
在Web3前端用Node.js子进程批量校验钱包,我踩了这些性能与安全的坑
javascript·node.js
农夫山泉不太甜2 小时前
Tauri v2 实战代码示例
前端
yuhaiqiang2 小时前
被 AI 忽悠后,开始怀念搜索引擎了?
前端·后端·面试
红色石头本尊2 小时前
1-umi-前端工程化搭建
前端
真夜2 小时前
关于对echart盒子设置百分比读取的宽高没有撑开盒子解决方案
前端
楠木6852 小时前
RAG 资料库 Demo 完整开发流程
前端·ai编程
肠胃炎3 小时前
挂载方式部署项目
服务器·前端·nginx
像我这样帅的人丶你还3 小时前
使用 Next.js + Prisma + MySQL 开发全栈项目
前端