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

组合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 )
    money.value = money.value - 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.create({
     // axios的一些配置, baseURL timeout
     baseURL,
        timeout:5000
    })

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

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

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

}, err => {
    return Promise.reject(err)
})

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


    return Promise.reject(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 转换成消息再来判断
        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
    })
}


第八步:
    测试请求
 
 setup () {
    const fn = () => {
      // 测试请求
      request('/member/profile', 'post', { a: 10 })
    }
    return { fn }
  }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部