网络请求
介绍
网络请求,没有使用Axios
,采用了VueUse
的一个函数useFetch
,与Axios
在使用上有明显的区别,使用中需要注意
api封装
基本未进行API请求封装,将API的分成四大类,
更新修改
==> put
==> usePut
数据新增
==>post
==>usePost
数据删除
==>delete
==>useDelete
数据获取
==>get
==>useGet
对api 主要进行了 enum
,如下
export enum ApiSysDictType {
// dict type
getById = '/system/dict/type/get_by_id',
getList = '/system/dict/type/list',
edit = '/system/dict/type/edit',
add = '/system/dict/type/add',
delete = '/system/dict/type/delete',
}
/**
@description: 字典数据Api
*/
export enum ApiSysDictData {
getByType = '/system/dict/data/get_by_type',
getById = '/system/dict/data/get_by_id',
getList = '/system/dict/data/list',
edit = '/system/dict/data/edit',
add = '/system/dict/data/add',
delete = '/system/dict/data/delete',
}
然后统一归在一起,方便使用
export type APIS =
| ApiSysDictType
| ApiSysDictData
数据返回
后端定义了统一的数据返回格式
export interface responseData {
code: number
data: any | null
msg: string
}
并前端进行了拦截,只返回data
部分给页面使用,如果发生错误,将全局通知消息msg
部分,并将data
设置为ErrorFlag
,可以在读取数据前,先判断,见如下
const { data, execute } = usePut(ApiSysUser.changeDept, {
user_id: userStore.user.uid,
dept_id: v,
})
await execute()
if (data.value === ErrorFlag) return
ElMessage.success(t('nav.changeDeptTip'))
如果发生错误,将不提示ElMessage.success(t('nav.changeDeptTip'))
该消息,只提示后端返回的错误信息
列表数据
定义的数据格式如下
export interface post extends operateInfo {
post_id?: string
post_code?: string
post_name?: string
post_sort?: number
status?: string
remark?: string
}
export interface postList extends pageData {
list: post[]
}
export interface postQueryParam extends pageQueryParam {
post_code?: string
post_name?: string
status?: string
}
useListData
第一种使用useListData
hook 函数
函数定义如下:
export interface listType<V extends operateInfo> extends pageData {
list: V[]
}
/**
* 列表数据相关数据;
* Q为查询参数泛型;
* V返回结果泛型;
* @param queryParam 请求参数
*/
export const useListData = <Q extends pageQueryParam, V extends operateInfo>(
api: APIS,
queryParam: Ref<Q>,
time?: Ref<string[]>
) => {
const list = ref<V[]>([]) as Ref<V[]>
const total = ref(0)
/**
* 获取数据列表
*/
const getListFn = async () => {
if (time) {
queryParam.value = addTimeQueryParam(queryParam.value, time?.value)
}
const { data, execute } = useGet<listType<V>>(api, queryParam)
await execute()
list.value = data.value?.list!
total.value = data.value?.total!
}
getListFn()
return {
getListFn,
list,
total,
}
}
使用方式如下,需要传入正确的泛型参数
const {
list: postListData,
getListFn: getList,
total,
} = useListData<postQueryParam, post>(ApiSysPost.getList, queryParams)
这种方式使用,数据异步请求,返回的数据是响应式数据,如果使用console.log()
打印数据,将全部是undefined数据,需要注意,打印时,一般数据都还没有返回
useGet
第二中使用方式
const postData= ref<post[]>([])
const getData = async () => {
const { data, execute } = useGet<postList>(
ApiSysPost.getList,
queryParams
)
await execute()
postData.value = data.value?.list!
}
需要在函数体中执行,然后赋值给定义好的数据