触发事件,按钮loading状态,封装hooks

背景:

正常请求接口中,当接口触发,需要声明loading值,作为监听正在请求或请求完成的状态,此hooks方便了这一写法

TypeScript 复制代码
//uselock.ts

import { ref } from 'vue';

export function useLockFn<T>(fn: (...args: any[]) => Promise<T>) {
  const isLock = ref(false);
  const lockFn = async (...args: any[]): Promise<T | undefined> => {
    if (isLock.value) return;
    isLock.value = true;
    try {
      const res = await fn(...args);
      isLock.value = false;
      return res;
    } catch (error) {
      isLock.value = false;
      throw error;
    }
  };
  return {
    isLock,
    lockFn,
  };
}

如何使用:

isLock是监听开始请求接口为true,请求结束的loading状态为false,

调用事件loginLock触发事件

html 复制代码
<script lang="ts" setup>
import {useLockFn} from './useLockFn.ts'
const { lockFn: loginLock, isLock } = useLockFn(async () => {
  if (phoneStatusType.value !== 'login') {
    ElMessage.warning('该账号未注册,请前往注册!');
    return;
  }
  await formRef.value?.validate();
  await props.submitValid?.();
  await getPhoneStatus();
  // 登录
  const data = Object.assign(formData, {
    username: formData.phonenumber,
    type: phoneStatusType.value,
    loginStatus: false,
  });
  await (formData.scene === LoginWayEnum.CODE
    ? authStore.mobileLogin(data)
    : authStore.adminLogin(data));
  ElMessage.success('登录成功');
});
</script>

<template>
  <el-button :loading="isLock" @click="loginLock">
    触发方法
  </el-button>
</template>
相关推荐
sophie旭15 小时前
一道面试题,开始性能优化之旅(8)-- 构建工具和性能
前端·面试·性能优化
市民中心的蟋蟀15 小时前
第三章 钩入React 【上】
前端·react.js·架构
Holin_浩霖16 小时前
为什么typeof null 返回 "object" ?
前端
PanZonghui16 小时前
Zustand 实战指南:从基础到高级,构建类型安全的状态管理
前端·react.js
PanZonghui16 小时前
Vite 构建优化实战:从配置到落地的全方位性能提升指南
前端·react.js·vite
_extraordinary_16 小时前
Java Linux --- 基本命令,部署Java web程序到线上访问
java·linux·前端
用户14567756103716 小时前
推荐一个我私藏的电脑神器:小巧、无广、功能强到离谱
前端
用户14567756103716 小时前
终于找到了!一个文件搞定PDF阅读
前端
liangshanbo121516 小时前
React 18 的自动批处理
前端·javascript·react.js
一位搞嵌入式的 genius16 小时前
前端实战开发(二):React + Canvas 网络拓扑图开发:6 大核心问题与完整解决方案
前端·前端框架