#javascript #vue.js #vuejs2 #vuex
#javascript #vue.js #vuejs2 #vuex
Вопрос:
У меня были проблемы, когда я получал нулевое значение из своего хранилища … иногда и только для некоторых значений. Если бы кто-нибудь мог указать мне правильное направление и объяснить, почему это неправильно… Я был бы очень благодарен. Итак, вот в чем дело, у меня store.getters.getApiKey
иногда ""
бывает, а иногда и нет. Итак … в приведенном ниже компоненте vue оно не равно null для первой ссылки
{{this.$store.getters.getApiKey}}
а затем в смонтированном разделе store.getters.getHostUrl
устанавливается, но store.getters.getApiKey
продолжает возвращаться ""
.
Вот подробности:
Component.vue
<template>
<div class="countryCodes">
<p>ApiKey : {{this.$store.getters.getApiKey}}</p>
<p>CountryCode Data is {{ page }}</p>
<div class="CountryCodes">
<tr v-for="ccdata in content_list" v-bind:key="ccdata.guid">
<td>{{ ccdata.guid }}</td>
<td>{{ ccdata.name }}</td>
<td>{{ ccdata.code }}</td>
</tr>
</div>
</div>
</template>
import axios from "axios";
import store from "@/store";
export default {
name: 'CountryCodes',
data () {
return {
page: "",
content_list: []
}
},
mounted () {
axios({ method: "GET", "url": store.getters.getHostUrl "
"/api/" store.getters.getApiKey "/countryCodes" }).then(result => {
this.page = result.data.page;
this.content_list = result.data.contents;
}, error => {
console.error(error);
});
},
methods: {
}
}
</script>
Тогда мое хранилище (store.js ) выглядит примерно так…
import Vuex from "vuex";
import Vue from 'vue';
Vue.use(Vuex)
export default new Vuex.Store({
state: {
apiKey: "",
hostUrl:""
},
mutations: {
SET_APIKEY(state, value) { state.apiKey = value; },
SET_HOST_URL(state, value) {state.hostUrl = value; }
},
getters: {
getApiKey(state) { return state.apiKey; },
getHostUrl(state) { return state.hostUrl; }
}
})
наконец, в моем main.js Я передаю данные в хранилище… :
import Vue from 'vue'
import App from './App.vue'
import router from './router/index.js'
import store from './store.js'
new Vue({
el: '#app',
render: h => h(App),
router,
store,
mounted: function() {
console.log(this.$route.query)
store.commit('SET_APIKEY', this.$route.query.api)
store.commit("SET_HOST_URL", location.origin.toString())
}
})
У меня такая же проблема при попытке создать http-сервис, где хранилище равно нулю для apikey. Какую магию я упускаю?
Комментарии:
1. Позвольте мне добавить деталь.. Я думаю, что это проблема времени. Данные отображаются на моем первом маршруте в приложении. Если я перейду на другой маршрут, а затем обратно, значения будут установлены правильно. Может быть, мне нужно добавить часы?
2. Я инициализирую свое хранилище в
beforeCreate()
Ответ №1:
Обычно mounted
перехват дочернего компонента вызывается перед mounted
родительским компонентом.
Если вы попытаетесь console.log
использовать оба mounted
хука, вы увидите порядок выполнения (но я все еще не уверен, почему ваш store.getters.getHostUrl
установлен).
Итак, вам нужен наблюдатель для запуска вашего кода после того, как в вашем хранилище появится значение.
Пример кода:
...
computed: { // or use another getters
url () {
if (!store.getters.getHostUrl || !store.getters.getApiKey) return
return `${store.getters.getHostUrl}/api/${store.getters.getApiKey}/countryCodes`
}
},
watch: {
url (value) {
...
}
}
...
Комментарии:
1. Спасибо! Я видел другую диаграмму состояний, в которой подробно описывается состояние компонента… но я не видел этого в потоке от компонента к компоненту. Очень полезно… Я вставил часы, и это сработало… Я также изучаю, когда вижу те значения, в которых указано! Как указано в статье, на которую вы указали, «неинтуитивный порядок срабатывания этих перехватов»!!!!
Ответ №2:
Итак …. было два способа решить эту проблему ….. спасибо за оба комментария.
-
Переключите мой смонтированный в main.js для создания — приведенная выше диаграмма объясняет, почему … а также хорошая статья.
-
добавьте «ожидание хранилища.getters.getApiKey»