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

相关推荐
大橙子额4 分钟前
【解决报错】Cannot assign to read only property ‘exports‘ of object ‘#<Object>‘
前端·javascript·vue.js
WooaiJava1 小时前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
爱喝白开水a2 小时前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied2 小时前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌412 小时前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
WeiXiao_Hyy2 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡3 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone3 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09013 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
游戏开发爱好者83 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview