vue3 axios封装js里如何引入pinia

996 阅读2分钟

在 Vue 3 中,如果你想要在一个封装了 Axios 的 JavaScript 文件中访问 Pinia 的 state,你需要确保该文件可以访问到 Pinia 的 store 实例。这通常是通过在 Vue 组件中使用 setup 函数并通过 useStore 钩子来实现的,但在封装的 Axios 文件中,你可能需要采取一些不同的策略。

以下是一些可能的方法:

1. 使用 provide 和 inject

你可以使用 Vue 3 的 provide 和 inject API 来在全局范围内提供 Pinia store,并在封装的 Axios 文件中注入它。

在 Vue 应用中提供 store

javascript复制代码
	// main.js 或 main.ts  

	import { createApp } from 'vue';  

	import { createPinia } from 'pinia';  

	import App from './App.vue';  

	  

	const app = createApp(App);  

	const pinia = createPinia();  

	app.use(pinia);  

	  

	// 提供 store  

	app.provide('piniaStore', pinia.state.value); // 注意:这不是标准用法,pinia.state.value 可能不会按预期工作  

	  

	app.mount('#app');

但请注意,pinia.state.value 并不是 Pinia 的标准用法,因为 Pinia 并没有直接暴露一个全局的 state 对象。上面的代码只是为了说明概念,实际上你可能需要提供一个方法来访问特定的 store。

在封装的 Axios 文件中注入 store

javascript复制代码
	// axios-wrapper.js  

	import { inject } from 'vue';  

	  

	// 假设你有一个名为 'counterStoreSymbol' 的 Symbol 用于注入 counter store  

	const counterStoreSymbol = Symbol('counterStore');  

	  

	export function axiosRequest(/* ... */) {  

	  // 注入 store  

	  const counterStore = inject(counterStoreSymbol);  

	  if (!counterStore) {  

	    throw new Error('Counter store must be provided');  

	  }  

	  

	  // 现在你可以使用 counterStore.state 来访问 Pinia state  

	  // ...  

	}

但这种方法要求你在每个使用封装的 Axios 函数的组件中都提供 store,这通常不是最佳选择。

2. 传递 Store 实例作为参数

一个更常见的做法是将 Pinia store 实例作为参数传递给封装的 Axios 函数。

在 Vue 组件中

javascript复制代码
	<script setup>  

	import { useCounterStore } from './counter';  

	import { axiosRequest } from './axios-wrapper';  

	  

	const counterStore = useCounterStore();  

	  

	// 调用封装的 Axios 函数并传递 store  

	axiosRequest(/* ... */, counterStore);  

	</script>

在封装的 Axios 文件中

javascript复制代码
	// axios-wrapper.js  

	export function axiosRequest(/* ... */, counterStore) {  

	  // 现在你可以使用 counterStore.state 来访问 Pinia state  

	  // ...  

	}

3. 使用 Vuex 风格的插件或中间件

虽然 Pinia 本身没有直接支持 Vuex 风格的插件系统,但你可以模拟这种行为。例如,你可以在封装的 Axios 函数中使用一个全局的配置对象或函数来访问 state。但请注意,这通常不如直接在需要时传递 store 实例那么清晰和直接。

结论

在大多数情况下,将 Pinia store 实例作为参数传递给封装的 Axios 函数是最简单和最直接的方法。这样可以确保你的代码清晰、可维护和可测试。