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

相关推荐
三*一17 分钟前
Mapbox‑GL JS 多边形折点编辑工具:实现原理、功能拆解与踩坑总结
开发语言·javascript·ecmascript
IT_陈寒1 小时前
Java开发实战:从入门到精通
前端·人工智能·后端
FungLeo1 小时前
成为全栈·基础补充·Node.js 运行时:事件循环与异步
javascript·node.js·事件循环·后端开发·异步编程·成为全栈
风骏时光牛马2 小时前
生成一个AI转岗经历标题,只需要一个标题,不需要其他的任何文本。
前端
Penge6662 小时前
《Go 后端开发者学 TypeScript:类型别名》
javascript
Penge6669 小时前
《Go 后端开发者学 TypeScript:数组和元组》
javascript
Penge66610 小时前
《Go 后端开发者学 TypeScript:export关键字大全》
javascript
Penge66610 小时前
《Go 后端开发者学 TypeScript:从零理解 async、await 与 Promise》
javascript
Penge66610 小时前
typescript 中const用法
javascript
Csvn11 小时前
Monorepo
前端