vite+vue3使用axios,provide,inject

1,src文件夹下新建utils/axios.ts
基本配置可以看axios官网

import axios from 'axios';
declare var configURl: any;
// 创建 axios 实例
const http = axios.create({
  baseURL: configURl[import.meta.env.MODE].url, // API 的 base_url
  timeout: 10000, // 请求超时时间
});
 
// 添加请求拦截器
http.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么,比如设置 token 等
    // config.headers['Authorization'] = `Bearer ${token}`;
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);
 
// 添加响应拦截器
http.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response.data;
  },
  error => {
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);
 
export default http;

备注:
1-1:axios的baseURL:
vite.config.ts

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path";

// https://vite.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
  server:{
    proxy:{
      '/a':{
        target: 'http://1.1.1.78:8088', // 后端服务器地址
        changeOrigin: true
      }
    }
  }
});

1-2:public下新建文件config.js

const configURl = {
    development: { url: '/a' },
    production: {}
}

1-3:在index.html中引入

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/javascript" src="/config.js"></script>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

2,main.ts

import Axios from "./utils/axios.ts";

const app = createApp(App);
app.provide('axios', Axios)
app
  .use(router)
  .use(ElementPlus, {
    locale: zhCn,
  })
  .mount("#app");

3,页面中使用

import { ref, reactive, onMounted,inject } from 'vue'
import { AxiosInstance } from 'axios';
// 加个非空断言
const $http = inject<AxiosInstance>('axios')!
const getData = () => {
  $http.get('/111/222').then(res => {
    if (res.code == 200) {
    
    }
  })
}
### 使用 Vue3 和 TypeScript 结合 Vite 实现模拟迁徙功能 #### 背景介绍 Vue3 提供了许多新特性,例如 Fragments、Composition API 等[^4]。这些特性的引入使得开发者可以更灵活地构建应用。为了实现从旧版本到 Vue3 的平滑迁移,可以通过创建一个兼容层来逐步过渡业务逻辑。 以下是基于 Vue3、TypeScript 和 Vite 构建的一个简单示例项目,展示如何通过 `provide` 和 `inject` 来实现数据共享以及多根节点的支持。 --- #### 技术栈说明 本项目的依赖如下所示: - Node.js 版本:v18.14.2 - Vue 版本:3.4.29 - Vite 版本:5.3.3 - TypeScript 版本:5.2.2 - Vue Router 版本:4.4.0 - Axios 版本:1.7.2 - Element Plus 版本:2.7.6 - ECharts 版本:5.5.1[^2] --- #### 示例代码 ##### 1. 创建提供者组件 (`ProviderComponent.vue`) 此组件负责向子组件注入全局状态: ```vue <template> <header>Header Content</header> <main>{{ message }}</main> <footer>Footer Content</footer> </template> <script lang="ts"> import { defineComponent, ref, provide } from &#39;vue&#39;; export default defineComponent({ name: &#39;ProviderComponent&#39;, setup() { const message = ref(&#39;This is a shared state&#39;); // Provide the value to child components provide(&#39;sharedMessage&#39;, message); return { message }; }, }); </script> ``` 此处利用了 Vue3 中的 `provide` 方法,允许父组件向下传递数据而无需显式声明 props。 --- ##### 2. 创建消费者组件 (`ConsumerComponent.vue`) 该组件接收来自父级的数据并显示它: ```vue <template> <p>The injected message is: {{ injectedMessage }}</p> </template> <script lang="ts"> import { defineComponent, inject } from &#39;vue&#39;; import type { Ref } from &#39;vue&#39;; export default defineComponent({ name: &#39;ConsumerComponent&#39;, setup() { // Inject the provided value into this component const injectedMessage = inject<Ref<string>>(&#39;sharedMessage&#39;); if (!injectedMessage) { throw new Error(&#39;Injected property not found!&#39;); } return { injectedMessage }; }, }); </script> ``` 这里展示了如何使用 `inject` 接收由祖先组件提供的值。 --- ##### 3. 主入口文件 (`App.vue`) 将上述两个组件组合在一起形成完整的页面结构: ```vue <template> <ProviderComponent /> <hr /> <ConsumerComponent /> </template> <script lang="ts"> import { defineComponent } from &#39;vue&#39;; import ProviderComponent from &#39;./components/ProviderComponent.vue&#39;; import ConsumerComponent from &#39;./components/ConsumerComponent.vue&#39;; export default defineComponent({ name: &#39;App&#39;, components: { ProviderComponent, ConsumerComponent, }, }); </script> ``` 注意,在 Vue3 中可以直接定义多个根节点而不需额外包裹一层 `<div>`。 --- #### 迁移注意事项 如果正在从 Vue2 升级至 Vue3,则需要注意以下几点变化: - **Fragments 支持**:Vue3 允许多个根节点的存在,这简化了一些模板设计上的约束。 - **Composition API**:推荐采用新的响应式编程模型替代 Options API。 - **Deprecation of `$listeners` and `$attrs`**: 新增 `v-model` 自定义修饰符支持[^3]。 更多详细的升级指导可查阅官方文档链接。 --- #### 总结 以上演示了一个简单的场景——借助 `provide/inject` 实现跨层级通信,并结合 Fragment 功能优化视图布局。这种模式非常适合处理大型单页应用程序中的复杂状态管理需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值