Итак, я пытаюсь сделать запрос с топором ios в моем main.js
файле.
Я использую, как показано, vue -рутер, чтобы сделать этот запрос перед каждым Компонент загружен. Однако я не могу заставить это работать, когда моя веб-страница загружается впервые. Я имею в виду, что запрос ax ios выполняется после загрузки компонента. Затем произойдет сбой:
mounted() {
if (Vue.prototype.$user.role == "Owner") {
this.isOwner = true;
this.estancoId = Vue.prototype.$user.estanco;
}
},
Это показывает мне эту ошибку в журнале консоли:
[Vue warn]: Error in mounted hook: "TypeError: Cannot read property 'role' of undefined"
found in
---> <Header> at src/components/Header.vue
<App> at src/App.vue
<Root>
Я попытался сделать этот запрос с асинхронным / ожиданием, я пытался методы mounted(), created(), beforeMount(), beforeCreate()
но все равно. Я новичок в Vue. js, и я застрял здесь и не знаю, что делать.
Редактируйте файлы целиком, чтобы увидеть структуру приложения: main. js
import router from './router'
import Vue from 'vue'
import App from './App.vue'
import { BootstrapVue, IconsPlugin } from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
import axios from 'axios'
import Vuex from 'vuex'
// Install BootstrapVue
import 'leaflet/dist/leaflet.css';
Vue.use(BootstrapVue)
// Optionally install the BootstrapVue icon components plugin
Vue.use(IconsPlugin)
Vue.use(axios)
Vue.use(Vuex)
Vue.config.productionTip = false
const store = new Vuex.Store({
state: {
user : {}
},
mutations : {
set_user (state,user) {
state.user = user
}
}
})
export default store
/* eslint-disable */
router.beforeEach((to, from, next) => {
if (from.path.indexOf("modificarCatalogo") == -1 && to.path.indexOf("modificarCatalogo") == -1) {
localStorage.removeItem("catalogue");
}
if (localStorage.getItem("token") != null) {
axios
.get(`${process.env.VUE_APP_API_BASE_URL}/user/role`, {
headers: {
Authorization: "Token " + localStorage.getItem("token")
}
})
.then(response => {
store.commit('set_user', response.data);
console.log("First then")
console.log(store.state.user)
}).catch(function (error) {
// handle error case here
console.log(error);
}).then(function () {
// always executed
console.log("Second then")
next();
});
}else{
next();
}
});
/* eslint-enable */
Vue.use(router)
new Vue({
router,
render: h => h(App),
}).$mount('#app')
Теперь у него есть Vuex, потому что я пытался ответить @ellisdod, но
Приложение. vue
<template>
<div>
<Header />
<router-view />
<Footer />
</div>
</template>
И, в Заголовок. vue, это то место, где я звоню, в данном случае Vuex $ store, но это то же самое. Мне нужно, чтобы это было сделано везде, поэтому я попытался вызвать метод в App. vue, но по-прежнему безрезультатно, теперь он возвращает пустой объект с решением Vuex, но просто пустой, а не с пользовательскими данными.
export default {
name: "Header",
data() {
return {
token: localStorage.getItem("token"),
isOwner: "",
estancoId: ""
};
},
mounted() {
console.log("Header log")
if (this.$store.state.user.role == "Owner") {
this.isOwner = true;
this.estancoId = this.$store.state.user.estanco;
}
},
Остальные компоненты не имеют значения, я думаю