前端系列十五:Vue3组合API跟封装axios

时间:2025-04-07 15:41:44

组合API-依赖注入:

使用provide函数和inject函数完成后代组件通讯

使用场景:
    有一个父组件,里头有子组件,有孙组件,有很多后代组件,共享父组件数据
    需要引入 provide 
父组件写法:
    import { provide } from 'vue'

    setup( ) {
         const money = 100
    //将数据提供给后代组件 provide
    provide( 'money' , money )
    return { money }
     }
           }

子组件写法:

    import { inject } from 'vue'
    setup( ) {
       const money = inject( 'money' )
    return { money }
    }


因为要遵循数据单向流原则

子组件想改变父组件的值必须通过父组件定义的方法来修改

    在父组件定义方法
父组件写法:
    setup( ) {
    cosnt money = ref( 100 )
    cosnt changgeMoney = ( saleMoney ) => {
    console.log( 'changeMoney', saleMoney )
     = - saleMoney
}

    provide( 'changeMoney', changeMoney )

子组件写法:
    setup( ) {
    const money = inject( 'money' )
    const = changeMoney = inject( 'changeMoney' )
    const fn = ( ) => {
    changeMoney( 20 )
    }
    return { money, fn }  
}

Vue3封装axios请求:

// 1.创建一个新的axios实例
// 2.请求拦截器,如果有token进行头部携带
// 3.响应拦截器: 1.剥离无效数据 2.处理token失效
// 4.导出一个函数,调用当前的axios实例 发送请求,返回值promise


第一步:
    安装axios       npm i axios

第二步: 
    导入axios    
写法:
    import axios from 'axios'
第三步:
    创建axios实例 
    const instance  = ({
     // axios的一些配置, baseURL timeout
     baseURL,
        timeout:5000
    })

第四步:
// 导出baseURL 导出基准地址 ,原因其他地方不是通过axios发请求的地方用上基准地址
export const baseURL = ''

第五步:
请求拦截器
// 引入vuex
import store from '@/store'

// 请求拦截器
.request.use(config =>{
    // 拦截业务逻辑
    // 进行请求配置的修改
    // 如果本地有token就在头部携带
    // 1.获取用户信息对象
    const {profile} =
  // 2.判断是否有token
    if() {
 // 3.设置token
        = `Bearer ${}`
    }
    return config

}, err => {
    return (err)
})

第六步:
    响应拦截器
    // 导入路由
    import router from '@/router'
    //响应拦截器: 1.剥离无效数据 2.处理token失效
// res => 取出data数据, 将来调用接口的时候直接拿到的就是后台的数据
(res => , err => {
    // 401 状态码 ,进入该函数
    if( && === 401) {
        // 1.清空无效用户信息
        // 2.跳转到登录页码
        // 3.跳转需要传参 (当前路由地址) 给登录页码
        ('user/setUser',{})
        // 当前路由地址
        // 组件里头:  `/user?a=10`  $ === /user $ === /user?a=10
        // js模块中: 就是当前路由地址 是ref响应式数据
        // 获取当前路由地址并转码
        const fullPath = encodeURIComponent()
        // encodeURIComponent 转换url编码,防止解析地址出问题
        ('/login?redirectUrl'+fullPath)
    } 


    return (err)
})


第七步:
    // 请求工具函数
    export default (url, methods, submitData) => {
    // 负责发请求: 请求地址, 请求方式 , 提交的数据
    return instance ({
        url,
        method,
        // 1.如果是get请求  需要使用params来传递submitData
        // 2.如果不是get请求  需要使用data来传递submitData
        // 3. [ ] 设置一个动态的key, 写js表达式, js表达式的执行结果当作KEY
        // method参数: get,Get,GET 转换成消息再来判断
        [() === 'get' ? 'params' : 'data']: submitData
    })
}


第八步:
    测试请求
 <button @click="fn">测试request工具函数</button>
 setup () {
    const fn = () => {
      // 测试请求
      request('/member/profile', 'post', { a: 10 })
    }
    return { fn }
  }