• axios---封装loadding组件的显示和隐藏


    需求:希望每一个请求,它在请求的时候都会在界面上显示一个loadding 动画。

    一、实现思路:

    1.在请求之前先显示一个loadding

    2.请求完成之后在把loadding 移除掉

     二、实现步骤:怎么给界面实现loadding:

    1.可以使用 element-plus 一个 loadding 组件

    2.倒入这个loadding 库

    import { ElLoading } from 'element-plus/lib/index' //引入 Loading 服务

    3.然后在调用时传入一些对应的参数:(这个应当在添加所有的实例拦截器中添加)

     4.我们可以在这个实例中添加 loading 属性,我们上面的代码是每个请求中都要携带loading 动画,但是有些地方是不需要携带loding动画的,所以我们要在在请求中在添加一个参数,让别人以参数的形式传过来,好让别人决定我们是否要显示这个loading。

    所以我们首先要对原来类型做一个扩展,然后在在配置中做个记录。

     4.在请求拦截成功判断这个loading是否显示

      5.在响应拦截里面取消这个loading 动画

    6.并且同时也要在resquest 做一个处理

     使用:

     代码改造:

    1. import axios from 'axios'
    2. import type { AxiosInstance } from 'axios' //instance 和 config 类型注解的倒入
    3. import type { JYRequestInterceptors, JYRequestConfig } from './type'
    4. import { ElLoading } from 'element-plus/lib/index' //引入 Loading 服务
    5. import { LoadingInstance } from 'element-plus/lib/components/loading/src/loading' //引入loading 类型
    6. const DEFAULT_LOADING=true
    7. // axios-->axios instance(实例)
    8. class JYRquest {
    9. instance: AxiosInstance //每次创建出来都用这个实例做一个保存
    10. interceptors?: JYRequestInterceptors
    11. showLoading: boolean //来这里记录下每次我们要不要显示这个showLoading
    12. loading?: LoadingInstance //作用:
    13. //创建一个类的构造器,这个构造器里面传入类的最基本的配置
    14. constructor(config: JYRequestConfig) {
    15. //axios里面有个create函数,它可以创建出来我们的实例
    16. this.instance = axios.create(config)
    17. this.showLoading = config.showLoading ?? DEFAULT_LOADING
    18. this.interceptors = config.interceptors
    19. //3.从config 中取出的拦截器是对应的实例的拦截器
    20. this.instance.interceptors.request.use(
    21. this.interceptors?.requestinterceptor,
    22. this.interceptors?.requestinterceptorCatch
    23. )
    24. //4.响应拦截器
    25. this.instance.interceptors.response.use(
    26. this.interceptors?.responseinterceptor,
    27. this.interceptors?.responseinterceptorCatch
    28. )
    29. //我们可以继续添加所有的实例都有的拦截器
    30. this.instance.interceptors.request.use(
    31. (config) => {
    32. // 判断要不要显示loading ,需要的情况下菜显示
    33. if (this.showLoading) {
    34. this.loading = ElLoading.service({
    35. lock: true,
    36. text: '正在请求数据...',
    37. background: 'rgba(0,0,0,0.5)'
    38. })
    39. }
    40. console.log('在我们所有的实例都有的拦截器')
    41. return config
    42. },
    43. (err) => {
    44. return err
    45. }
    46. )
    47. this.instance.interceptors.response.use(
    48. (res) => {
    49. // 将loading 移除
    50. this.loading?.close()
    51. const data = res.data
    52. if (data.returnCode === '-1001') {
    53. console.log('请求失败,错误信息')
    54. }
    55. return res.data
    56. },
    57. (err) => {
    58. this.loading?.close()
    59. return err
    60. }
    61. )
    62. }
    63. //封装一个request 函数
    64. //注意:这里让别人传config 的时候,不能传默认的了, 因为默认的话它不能传入任何的拦截器,所以这里可以传
    65. //这个JYRequestConfig 是继承制 AxiosRequestConfig 的
    66. request(config: JYRequestConfig): void {
    67. //判断里面是否有requestinterceptor 这个函数
    68. //1.单个请求对请求config 的处理
    69. if (config.interceptors?.requestinterceptor) {
    70. //如果有这个函数,就将 config =config.interceptors.requestinterceptor(然后将config传进来)
    71. //如果这里真的有这个函数,就执行这个函数
    72. /**
    73. requestinterceptor 这个函数的目的就是对(config),
    74. 做一个转化,转化完之后,还会把默认的config 返回回来,然后再用一个config做一个接收
    75. */
    76. config = config.interceptors.requestinterceptor(config)
    77. }
    78. // 2.判断是否需要显示loading , 这个值为false 的时候在执行这里面的函数,
    79. if(config.showLoading===false){
    80. this.showLoading=config.showLoading
    81. }
    82. this.instance.request(config).then((res) => {
    83. //1.单个请求对数据的处理
    84. if (config.interceptors?.responseinterceptor) {
    85. res = config.interceptors.responseinterceptor(res)
    86. }
    87. //2.每次请求完成之后设置回初始值,这样就不会影响下一个请求
    88. this.showLoading=DEFAULT_LOADING
    89. })
    90. .catch((err)=>{
    91. this.showLoading=DEFAULT_LOADING
    92. return err
    93. })
    94. }
    95. }
    96. export default JYRquest

  • 相关阅读:
    CentOS7.9离线安装Docker环境
    Json“牵手”唯品会商品详情数据方法,唯品会商品详情API接口,唯品会API申请指南
    阿里巴巴云生态 9 大开源项目重磅发布
    关于安卓毛玻璃实现(一)动态毛玻璃
    开源博客项目Blog .NET Core源码学习(23:App.Hosting项目结构分析-11)
    HFSS端口介绍2---波端口
    前端HTML笔记整理
    【Nginx学习】—Nginx基本知识
    [思维]The Third Problem CF1699C
    2022世界杯La‘eeb肖像,python海龟实现啦
  • 原文地址:https://blog.csdn.net/weixin_51614564/article/details/125894067