javascript - 当我尝试从 API 加载数据并在多个组件中使用时,Vuex getter 有未定义的数据
问题描述
我有一个页面组件,我在其中进行 api 调用并通过操作将数据存储在 Vuex 存储中。这些数据必须在多个地方使用,但在任何地方我最初都会得到未定义的数据,这些数据会在几秒钟后从 API 异步加载。我应该如何异步使用 vuex getter?
这是我的 vuex 商店模块的代码:
import axios from 'axios';
const state = {
all_pokemon: {},
pokemon_details: {}
};
const getters = {
getAllPokemon: function(state) {
return state.all_pokemon;
},
getPokemonDetails: function(state) {
return state.pokemon_details;
}
};
const mutations = {
setAllPokemon: function(state, payload) {
return state.all_pokemon = payload;
},
setPokemon: function(state, payload) {
console.log('Pokemon details set with payload ', payload);
return state.pokemon_details = payload;
}
};
const actions = {
setPokemonAction: function({ commit }, passed_pokemon) {
axios.get('https://pokeapi.co/api/v2/pokemon/' + passed_pokemon)
.then((response) => {
console.log('Response data is : ', response.data);
});
commit('setAllPokemon', response.data);
},
setPokemonDetailAction: function({ commit }, passed_pokemon) {
console.log('Action method called..', passed_pokemon);
axios.get('https://pokeapi.co/api/v2/pokemon/' + passed_pokemon)
.then((response) => {
commit('setPokemon', response.data);
});
}
};
export default {
state,
getters,
mutations,
actions,
};
以及我想要获取此数据并将其传递给其他组件的组件的代码:
<script>
import { mapGetters, mapActions } from 'vuex'
import axios from 'axios'
// Imported other components here
export default {
name: 'pokemon_detail_page',
data() {
return {
current_pokemon: this.$route.params.pokemon,
isLoading: false,
childDataLoaded: false,
search_pokemon: '',
sprites: [],
childData: 'False',
isAdded: false,
pokemon_added: 'none_display',
show: false
}
},
methods: {
...mapActions([
'setPokemonDetailAction',
'removePokemon'
]),
},
computed: {
...mapGetters([
'getPokemonDetails',
'getTeam'
])
},
components: {
Game_index,
PulseLoader,
PokemonComponent,
},
filters: {
},
watch: {
getTeam: function (val) {
},
getPokemonDetails: function(val) {
}
},
created() {
setTimeout(() => {
this.show = true;
}, 2000);
this.$store.dispatch('setPokemonDetailAction', this.current_pokemon)
.then(() => {
// const { abilities, name, order, species, } = {...this.getPokemonDetails};
})
},
mounted() {
},
}
</script>
这是我将这些数据传递给多个组件的模板的代码:
<div v-if="show" class="pokemon_stats_container" :key="childData">
<ability-component
:abilities="getPokemonDetails.abilities"
>
</ability-component>
<sprites-component
:sprites="sprites"
>
</sprites-component>
<location-component
:location_area="getPokemonDetails.location_area_encounters"
:id="getPokemonDetails.id"
>
</location-component>
<stats-component
:stats="getPokemonDetails.stats"
>
</stats-component>
<game_index
:game_indices="getPokemonDetails.game_indices"
/>
<moves-component
:moves="getPokemonDetails.moves"
:pokemon_name="getPokemonDetails.name"
>
</moves-component>
</div>
到目前为止,我采用了一种迂回的方式,通过 setTimeout 并在 2 秒后设置一个变量,以便其他组件可以使用数据。但是,必须有一种更优雅的方式来处理 vuex 异步数据。有人请帮助我。
解决方案
你的第一次提交不在承诺中
commit('setAllPokemon', response.data);
做这个:
axios.get('https://pokeapi.co/api/v2/pokemon/' + passed_pokemon)
.then((response) => {
console.log('Response data is : ', response.data);
commit('setAllPokemon', response.data);
});
尝试在您的 vue 组件中使用
$forceUpdate()
当您的请求结束重新加载数据时
推荐阅读
- php - 面包屑菜单 PHP 生成额外的空白锚链接
- mysql - 尝试将原始 sql 转换为 laravel 查询生成器时出错
- rust - 如何将串行端口数据读入动态大小的缓冲区?
- r - 跨数据帧计算函数
- python - 使用 tkinter 单击按钮接收输入,然后返回我输入的任何内容,以便能够将其传递给其他函数
- google-bigquery - BigQuery 根据条件更新嵌套表
- httprequest - 带有正文的 HttpRequest DELETE
- npm - 如何运行 npm.cmd?
- sockets - TCPDUMP,tcp 标志未从标志 [S] 更改为其他标志值
- react-data-grid - 为什么这些 react-data-grid 列不能调整大小?