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

相关推荐
AI多Agent协作实战派11 分钟前
AI多Agent协作系统实战(二十三):Agent读HEARTBEAT.md不读AGENTS.md——openclaw的文件加载之谜
前端·数据库·人工智能·uni-app
gis开发之家27 分钟前
《Vue3 从入门到大神37篇》Vue3 源码详解(七):watch 与 watchEffect 源码对比——副作用是如何被追踪的?
javascript·前端框架·vue3·vue3源码
2601_955760071 小时前
如何用 Claude Opus 5 API 批量扩展长尾关键词和文章选题
前端·python·搜索引擎
KaMeidebaby1 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
bloglin999992 小时前
langchain 和 langgraph 和 react
javascript·react.js·langchain
触底反弹2 小时前
🚀 删了数据刷新又回来?3 组件 × 4 回调 × 3 坑讲透 React 父子通信
前端·javascript·react.js
耳东小鹿3 小时前
对象常用方法
前端
程序员海军3 小时前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
程序员黑豆3 小时前
鸿蒙应用开发:Stack堆叠组件实战——实现微信消息角标效果
前端·harmonyos
夏幻灵3 小时前
浏览器原理深度解析:从输入 URL 到页面展现的全流程剖析
前端