Как использовать результат api с действиями из Vuex

#vue.js #vuex #vuejs3 #vuex4

Вопрос:

Я пытаюсь извлечь избранное пользователя с помощью axios, когда пользователь входит в систему. Для этого я использую Vuejs с Vuex. Все о процессе ведения журнала в порядке, но что касается избранного, я что-то упускаю, но не знаю что.

Моя store.ts такая, как эта :

 export const store = createStore({
    state: {
        user: null,
        token: null,
        favorites: []
    },

    mutations: {
        setUser(state, user) {
            state.user = user;
        },
        setToken(state, token) {
            state.token = token;
        },
        setFavs(state, favorites) {
            state.favorites = favorites;
        },
    },
    actions: {
        getFavorites({ commit }) {
            axios
                .post("URL_HERE", {
                    userId: this.state.user,
                })
                .then((res) => {
                    //console.log(res);
                    commit('setFavs', res.data)

                })
                .catch((error) => {
                    console.log(error);
                })
        }
    },
    getters: {
        getFavs: (state) => state.favorites
    },
});
 

На моем компоненте «Избранное» у меня есть :

 export default defineComponent({
  name: "Favorites",
  data() {
    return {
      favorites: null,
    };
  },
  computed: {
    ...mapGetters(["isLoggedIn"]),
    ...mapGetters({ Favorites: "getFavs" }),
  },
});
 

Затем в шаблоне :

 <div v-for="favorite in Favorites" :key="favorite.event_id">
 <li>{{ favorite }}</li>
</div>
 

Ответ №1:

Вам нужно отправить действие в установленный крюк:

 export default defineComponent({
  name: "Favorites",
  data() {
    return {
      favorites: null,
    };
  },
  computed: {
    ...mapGetters(["isLoggedIn"]),
    ...mapGetters({ Favorites: "getFavs" }),
  },
 methods:{
  ...mapActions(['getFavorites'])//map the actions as you did with getters
 },
 mounted(){
  this.getFavorites();//dispatch the action
},
//or use a watcher
watch:{
isLoggedIn(newVal,oldVal){
  if(newVal){
        this.getFavorites()
   }
}

}
});
 

Комментарии:

1. О, хорошо, теперь я все понял ! Как динамически прослушивать его вместо «смонтированного» крючка ?

2. вы могли бы отправить его с помощью такого события, как @click="getFavorites"

3. Когда я вхожу в систему, я использую мутацию для хранения идентификатора пользователя. Мне нужно извлекать избранное только в том случае, если оно установлено

4. вы могли бы использовать наблюдателя, как я уже упоминал в своем отредактированном ответе

5. Так же просто.. ну, я думаю, мне нужно узнать больше о доступе к данным, спасибо, чувак !