Как использовать Pinia вне компонента в файле js
Я перехожу с vue 4.x на pinia, одному из моих файлов нужен ключ API из магазина. Но я могу заставить его работать, даже если я следую документации Pinia . вот как я использую пинию
// Репозиторий.ts
import axios from "axios";
import { createPinia } from 'pinia'
import { useAuthStore } from '../stores/auth-store'
const pinia=createPinia();
let authStore = useAuthStore(pinia);
const baseURL = 'http://127.0.0.1:5678/res-api';
export default axios.create({
baseURL,
headers:{"Authorization":"Bearer " + authStore.getToken,
"Accept":"application/json"},
});
Ожидаемый результат: получить токен из магазина.
Ошибка консоли
Uncaught ReferenceError: Cannot access 'useAuthStore' before initialization
at Repository.ts:6:17
Note: this working inside a component
3 ответа
Вы можете решить это, импортировав магазин внутрь перехватчиков
import axios from "axios";
import { useAuthStore } from '../stores/auth-store';
const axiosClient = axios.create({
baseURL: 'http://127.0.0.1:5678/res-api'
});
axiosClient.interceptors.request.use((config) => {
const authStore = useAuthStore();
config.headers.Authorization = `Bearer ${authStore.getToken}`;
config.headers.Accept = "application/json";
return config
})
export default axiosClient;
Это обсуждение может вам помочь: Перейти к обсуждению на GitHub
Согласно документации, созданная вами пиния должна быть параметром app.use. Кроме того, useAuthStore должен быть хранилищем, определенным с помощью defineStore, и не должен принимать параметр. Я оставлю ссылку, которая может вам помочь, она не создает магазин, но вы можете просмотреть боковое меню, чтобы увидеть несколько примеров.
https://pinia.vuejs.org/core-concepts/outside-component-usage.html
Вот мой пример проекта для демонстрации проблемы: https://codesandbox.io/s/infallible-shamir-sxrlb9.
Основная причина здесь в том, что вы не можете использовать магазины Pinia, прежде чем передать их в приложение Vue. Итак, указан следующий код:
const pinia = createPinia(); // line 1
createApp(App).use(pinia).mount("#app"); // line 2
Вы не можете активировать сохранение между строками 1 и 2, но только после строки 2.
В вашем коде, вероятно, вы инициируете вызов axios перед созданием приложения Vue/добавлением Pinia в приложение Vue. Пожалуйста, попробуйте отложить запуск этого вызова axios после завершения установки приложения Vue.