Я создал приложение в Vue.Он состоит из ряда отдельных модулей, каждый из которых соответствует маршруту и имеет компонент верхнего уровня (и множество подкомпонентов / дочерних элементов).У каждого модуля есть свое собственное хранилище, действия, мутации и геттеры, а также вызовы API, отправляемые в хуки компонентов selected () для получения необходимых данных.
Это структура моего приложения:
Candidates.vue
created() {
this.$store.dispatch('$_candidates/getAllCandidates');
},
/ modules /андидаты / _store / actions.js
import api from '../_api';
const getAllCandidates = (context) => {
api.fetchAllCandidates
.then((response) => {
context.commit('ALL_CANDIDATES_FETCHED', response.data.candidate_list);
})
.catch((error) => {
// eslint-disable-next-line
console.error(error);
});
};
/ modules /андидаты / _api / index.js
import { fetchData } from '@/helpers';
const allCandidatesEndpoint =
'https://myapiendpoint.io/candidates/list/all';
const fetchAllCandidates = fetchData(allCandidatesEndpoint, 'get');
export default {
fetchAllCandidates,
};
В хуке beforeCreate () App.vue у меня есть помощникфункция для регистрации всех модулей приложения за один раз.Я делаю это, импортируя сохраненные модули в файл помощника и затем регистрируя их.Это мой вспомогательный файл:
helpers.js
import axios from 'axios';
import { store } from '@/store/store';
import candidatesStore from './modules/candidates/_store';
import dashboardStore from './modules/dashboard/_store';
import eventsStore from './modules/events/_store';
import loginStore from './modules/login/_store';
function fetchData(endpoint, requestType, requestBody) {
const apiToken = store.state.apiToken;
delete axios.defaults.auth;
return axios.request({
method: requestType,
data: requestBody,
url: endpoint,
headers: {
'server-token-id': apiToken,
},
})
.then(response => response)
.catch(error => error);
}
/* Register all of the Vuex modules we'll need to manage application state */
function registerVuexModules() {
store.registerModule('$_candidates', candidatesStore);
store.registerModule('$_dashboard', dashboardStore);
store.registerModule('$_events', eventsStore);
store.registerModule('$_login', loginStore);
}
function unregisterVuexModules() {
store.unregisterModule('$_candidates', candidatesStore);
store.unregisterModule('$_dashboard', dashboardStore);
store.unregisterModule('$_events', eventsStore);
store.unregisterModule('$_login', loginStore);
}
export {
fetchData,
registerVuexModules,
unregisterVuexModules,
};
... и я импортирую в App.vue так:
beforeCreate() {
registerVuexModules();
},
Однако импорт каждого модуля каким-то образом инициирует вызов API (используя функцию fetchData), который возвращает 401. Я подтвердил это, закомментировав различные части файла helpers.js - и это определенно импорт, а не функциисами по себе.
Когда я удаляю импорт хранилища модулей в helpers.js, вызов API не выполняется для компонента верхнего уровня этого модуля.Для меня странными частями являются:
Несмотря на то, что действия, которые должны вызывать эти вызовы API, отправляются только в компоненты верхнего уровня каждого модуля, вызовы API предпринимаются при каждой перезагрузкестраницу входа, даже до создания этих компонентов;
Vue-dev-tools не регистрирует соответствующие события для отправляемых действий;
Если я удаляю весь импорт хранилища из файла помощника, никаких вызовов API не происходит.
Я попытался изменить формат своих импортов в vue-router, чтобы компоненты были ленивымизагружен, как я и думал, это может быть проблемой.Размер пакета уменьшился, но это не исправило фантомные вызовы API.Вот как я их импортирую ...
/ router / index.js
import Vue from 'vue';
import Router from 'vue-router';
import axios from 'axios';
import { store } from '../store/store';
/* Lazy load all of the components required for the routes */
const Login = () => import(/* webpackChunkName: "login" */
'@/modules/login/Login');
const Dashboard = () => import(/* webpackChunkName: "dashboard" */
'@/modules/dashboard/Dashboard');
...
const router = new Router({
routes: [
{
path: '/',
name: 'root',
component: Login,
},
{
path: '/login',
name: 'login',
component: Login,
},
{
path: '/dashboard',
name: 'dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
guard(to, from, next);
},
},
...
Может кто-нибудь объяснить это поведение или что я пропустил?