У меня есть магазин и компонент. В моем компоненте и в created()
я выполняю выборку API, поэтому мое состояние меняется, а также в computed
я использую mapGetters
, чтобы я мог получить доступ к своему состоянию. Но когда я это делаю, на экране ничего не отображается. Я даже использую директиву v-if
, чтобы узнать, не определено значение или нет. Также я должен упомянуть, что в Vue devtools я ясно вижу, что состояние обновляется правильно, и я вижу, что данные извлекаются из API. Я уже столько искал в Интернете и пробовал все, что мог найти. Сработало только одно решение, и в моем компоненте также должны были быть данные, но это решение не является хорошим решением из-за дублирования данных (один локальный для компонента и один в магазине). Вот мой код:
фильмы. js (магазин)
import axios from 'axios';
const state = {
heading: '',
movies: [],
};
const getters = {
getMovies: (state) => state.movies,
getHeading: (state) => state.heading,
};
const actions = {
async fetchTopRatedMovies({ commit }) {
const res = await axios.get(
`https://api.themoviedb.org/3/movie/top_rated?api_key=${process.env.VUE_APP_THEMOVIEDB_API_KEY}&language=en-US&page=1`
);
commit('setMovies', res.data.results);
commit('setHeading', 'Top Rated Movies');
},
};
const mutations = {
setMovies: (state, movies) => (state.movies = movies),
setHeading: (state, heading) => (state.heading = heading),
};
export default {
state,
getters,
actions,
mutations,
};
фильмы. vue (компонент)
<template>
<div v-if="!heading || !movies">
<Spinner />
</div>
<div v-else>
<h5 class="center">{{ heading }}</h5>
<div v-for="movie in movies" :key="movie.id">
<p>{{ movie.title }}</p>
</div>
</div>
</template>
<script>
import Spinner from '../layout/Spinner';
import { mapActions, mapGetters } from 'vuex';
export default {
name: 'Movies',
components: {
Spinner,
},
methods: {
...mapActions(['fetchTopRatedMovies']),
},
computed: {
...mapGetters(['getMovies', 'getHeading']),
},
created() {
this.fetchTopRatedMovies();
},
};
</script>
<style></style>
Один из способов решить эту проблему - изменить computed
на:
computed: {
...mapGetters({
heading: 'getHeading',
movies: 'getMovies',
}),
},
, но мне интересно, почему это должно быть так. Потому что в документации это написано так же, как и в приведенном выше коде.