当前位置:   article > 正文

vue3 +ts 安装并封装axios_vue3 ts axios封装

vue3 ts axios封装

目录

1、为什么要封装axios

2、安装

3、封装request

4、使用步骤

 步骤1:请求数据 ( 举例下面几个常用的 )

 步骤2:在要请求的组件上使用

5、代理


1、为什么要封装axios

axios.get().then()   这样的书写,会有缺陷,在以下缺点
1、请求头能不能统一处理
    解决: 创建一个 request/request.js 文件夹,
        在里面可以使用axios.create创建实例对象
        也可以在里面设置  请求 与 响应 拦截器

2、不便于接口的统一管理  
    解决:在 request 文件夹加多一个api文件来管理所有接口,
        (会先导入rerequest.js的实例)
        并使用函数,不然每次发请求时都会跑一次api文件

3、容易出现回调地狱
    LogoutAPI () 最终的结果是返回proise对象
    解决:acync + await
    await 后面一般放promise对象

注意:但封装axios后还是可以用 .then() 

2、安装

npm install axios

3、封装request

先在 src 下创建一个 request 文件夹,并添加一个  request.ts  文件

  1. import axios from 'axios'
  2. // 创建axios实例
  3. const request = axios.create({
  4. baseURL: '',// 所有的请求地址前缀部分
  5. timeout: 80000, // 请求超时时间(毫秒)
  6. withCredentials: true,// 异步请求携带cookie
  7. // headers: {
  8. // 设置后端需要的传参类型
  9. // 'Content-Type': 'application/json',
  10. // 'token': x-auth-token',//一开始就要token
  11. // 'X-Requested-With': 'XMLHttpRequest',
  12. // },
  13. })
  14. // request拦截器
  15. request.interceptors.request.use(
  16. config => {
  17. // 如果你要去localStor获取token,(如果你有)
  18. // let token = localStorage.getItem("x-auth-token");
  19. // if (token) {
  20. //添加请求头
  21. //config.headers["Authorization"]="Bearer "+ token
  22. // }
  23. return config
  24. },
  25. error => {
  26. // 对请求错误做些什么
  27. Promise.reject(error)
  28. }
  29. )
  30. // response 拦截器
  31. request.interceptors.response.use(
  32. response => {
  33. // 对响应数据做点什么
  34. return response.data
  35. },
  36. error => {
  37. // 对响应错误做点什么
  38. return Promise.reject(error)
  39. }
  40. )
  41. export default request

4、使用步骤

注意:​​因为get请求的参数需要`params`,它是即将与请求一起发送的 URL 参数,为了简写采用了ES6的解构,就是把下面的 params 解构,只有get 请求需要加多一层`params`

 其它请求,如 post 等请求等就不用解构,形参是什么都行。

 步骤1:请求数据 ( 举例下面几个常用的 )

在 request 文件夹,再添加一个  api.ts  文件

定义接口格式:

export  const  自定义接口名  =  (形参:请求类型):返回类型  =>  instance.方法(路径,后端要的参数);

  1. import instance from "./request";
  2. //一般情况下,接口类型会放到一个文件
  3. // 下面两个TS接口,表示要传的参数
  4. interface ReqLogin {
  5. name: string
  6. paw: string
  7. }
  8. interface ReqStatus {
  9. id: string
  10. navStatus: string
  11. }
  12. // Res是返回的参数,T是泛型,需要自己定义,返回对数统一管理***
  13. type Res<T> = Promise<ItypeAPI<T>>;
  14. // 一般情况下响应数据返回的这三个参数,
  15. // 但不排除后端返回其它的可能性,
  16. interface ItypeAPI<T> {
  17. data: T,//请求的数据,用泛型
  18. msg: string | null // 返回状态码的信息,如请求成功等
  19. code: number //返回后端自定义的200,404,500这种状态码
  20. }
  21. // post请求 ,没参数
  22. export const LogoutAPI = (): Res<null> =>
  23. instance.post("/admin/logout");
  24. // post请求,有参数,如传用户名和密码
  25. export const loginAPI = (data: ReqLogin): Res<string> =>
  26. instance.post("/admin/login", data);
  27. // post请求 ,没参数,但要路径传参
  28. export const StatusAPI = (data: ReqStatus): Res<null> =>
  29. instance.post(`/productCategory?ids=${data.id}&navStatus=${data.navStatus}`);
  30. // get请求,没参数,
  31. export const FlashSessionListApi = (): Res<null> =>
  32. instance.get("/flashSession/list");
  33. // get请求,有参数,路径也要传参 (也可能直接在这写类型,不过不建议,大点的项目会维护一麻烦)
  34. export const ProductCategoryApi = (params: { parentId: number }): any =>
  35. instance.get(`/productCategory/list/${params.parentId}`, { params });
  36. // get请求,有参数,(如果你不会写类型也可以使用any,不过不建议,因为用了之后 和没写TS一样)
  37. export const AdminListAPI = (params:any): any =>
  38. instance.get("/admin/list", { params });

 步骤2:在要请求的组件上使用

使用方式一:直接使用(和vue2在cretae上用一样,setup自带async,await在顶层可以直接使用)

  1. <script setup lang="ts">
  2. import { indexAPI} from "../../request/api";
  3. //直接使用,一般用在进入页面入请求数据的接口
  4. let res = await indexAPI()
  5. console.log( "***" ,res);
  6. </script>

使用方式二:使用 async / await,(setup虽然自带async,但单独用await只能在顶层使用,如果在函数下还是要async / await一起写)

  1. <script setup lang="ts">
  2. import { returnApplyListAPi } from "../../request/api";
  3. const search = async(val: IUseTableParam) => {
  4. let res = await returnApplyListAPi({
  5. ...val,
  6. })
  7. console.log( "***" ,res);
  8. let { list, pageNum, pageSize, total } = res.data
  9. console.log(list, pageNum, pageSize, total);
  10. }
  11. </script>

使用方式三:使用.then

  1. <script setup lang="ts">
  2. import { returnApplyListAPi} from "../../request/api";
  3. const logout = () => {
  4. returnApplyListAPi({
  5. ...val,
  6. }).then((res) => {
  7. console.log('***',res );
  8. let { list, pageNum, pageSize, total } = res.data
  9. })
  10. };
  11. </script>

5、代理

需要代理才写

上面的request 文件中 

  1. const request = axios.create({
  2. //这时你要代理
  3. //填写后端统一的前缀,
  4. //如:123.xx.xx.xx:456/api/...
  5. //这个/api是每一个接口都有的,就写它
  6. //如果没有,也写,下面会讲区别
  7. baseURL: '/api',
  8. })

vite.config.ts 文件

  1. // https://vitejs.dev/config/
  2. export default defineConfig({
  3. plugins: [
  4. vue(),
  5. //...
  6. ],
  7. server: {
  8. proxy: {
  9. '/api': { // 匹配请求路径,
  10. target: '你要代理的地址', // 代理的目标地址
  11. // 开发模式,默认的127.0.0.1,开启后代理服务会把origin修改为目标地址
  12. changeOrigin: true,
  13. // secure: true, // 是否https接口
  14. // ws: true, // 是否代理websockets
  15. // 路径重写,**** 如果你的后端有统一前缀(如:/api),就不开启;没有就开启
  16. //简单来说,就是是否改路径 加某些东西
  17. rewrite: (path) => path.replace(/^\/api/, '')
  18. }
  19. }
  20. }
  21. })

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/285660
推荐阅读
相关标签
  

闽ICP备14008679号