Skip to content

useRequest

请求管理 hook,提供统一的请求状态管理和错误处理。

功能特性

  • 🔄 自动加载状态管理
  • ⚡ 支持防抖请求
  • 🎯 支持批量请求
  • 🛡️ 自动错误处理

基本用法

vue
<template>
  <div>
    <el-button @click="run" :loading="loading">
      {{ loading ? '加载中...' : '获取数据' }}
    </el-button>
    
    <div v-if="data">
      <pre>{{ JSON.stringify(data, null, 2) }}</pre>
    </div>
    
    <div v-if="error" style="color: red;">
      错误: {{ error.message }}
    </div>
  </div>
</template>

<script setup>
import { useRequest } from 'element-plus-lego';

// 单个请求
const fetchUser = async (params) => {
  const response = await fetch(`/api/users/${params.id}`);
  return response.json();
};

const {
  loading,
  params,
  data,
  error,
  run
} = useRequest(fetchUser, {
  params: { id: 1 },
  immediate: false
});
</script>

批量请求

vue
<script setup>
import { useRequest } from 'element-plus-lego';

// 批量请求
const fetchUser = async (params) => {
  const response = await fetch(`/api/users/${params.id}`);
  return response.json();
};

const fetchProfile = async (params) => {
  const response = await fetch(`/api/profiles/${params.id}`);
  return response.json();
};

const {
  loading,
  params,
  data,
  error,
  run
} = useRequest([fetchUser, fetchProfile], {
  params: { id: 1 },
  immediate: true
});

// data.value 将是一个数组: [userData, profileData]
</script>

防抖请求

vue
<script setup>
import { useRequest } from 'element-plus-lego';

const searchUsers = async (params) => {
  const response = await fetch(`/api/users/search?q=${params.query}`);
  return response.json();
};

const {
  loading,
  params,
  data,
  run
} = useRequest(searchUsers, {
  params: { query: '' },
  delay: 500,  // 500ms 防抖
  immediate: false
});

// 搜索输入时自动防抖
const handleSearch = (query) => {
  params.value.query = query;
  run(); // 会被防抖处理
};
</script>

API 参数

参数类型默认值说明
serviceTService | TService[]-请求服务函数或函数数组
options.initDataanyundefined初始数据
options.immediatebooleantrue是否立即执行
options.delaynumber0防抖等待时间(毫秒)
options.paramsany{}请求参数

返回值

属性类型说明
loadingRef<boolean>加载状态
paramsRef<any>请求参数
dataRef<any>响应数据
errorRef<any>错误信息
run() => void手动执行请求

类型定义

ts
export type TService = (...args: any[]) => Promise<any> | Promise<any>[];

export interface IOptions {
  initData?: any;     // 初始值
  immediate?: boolean; // 是否立即执行
  delay?: number;     // 防抖等待时间
  params?: any;       // 请求参数
}

使用场景

1. 数据列表请求

vue
<script setup>
const fetchList = async (params) => {
  const response = await fetch('/api/list', {
    method: 'POST',
    body: JSON.stringify(params)
  });
  return response.json();
};

const { loading, data, run } = useRequest(fetchList);
</script>

2. 搜索功能

vue
<script setup>
const search = async (params) => {
  const response = await fetch(`/api/search?q=${params.keyword}`);
  return response.json();
};

const { loading, data, run } = useRequest(search, {
  delay: 300,
  immediate: false
});
</script>

3. 表单提交

vue
<script setup>
const submitForm = async (params) => {
  const response = await fetch('/api/submit', {
    method: 'POST',
    body: JSON.stringify(params)
  });
  return response.json();
};

const { loading, run } = useRequest(submitForm, {
  immediate: false
});
</script>