Vuex 正在重置已经设置的状态

Vuex is resetting already set states

已经开始使用 Vuex 并且有点困惑。

它会在我每次加载组件时触发操作 GET_RECRUITERS company.vue 因此也会进行 api 调用。

例如,如果我打开 company.vue => 使用 vue-router 导航到 user/edit.vue,然后他们返回,它将再次调用 action/api(招聘人员已保存根据 Vue-dev-tools 在商店中)。

如果我错了,请纠正我 - 如果我再次返回页面,它不应该触发 action/api 并因此重置状态,对吗?还是我误解了 Vuex 的意图?

company.vue

<template>
  <card>

    <select>
      <option v-for="recruiter in recruiters"
              :value="recruiter.id">
        {{ recruiter.name }}
      </option>
    </select>

  </card>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  middleware: 'auth',

  mounted() {
    this.$store.dispatch("company/GET_RECRUITERS")
  },

  computed: mapGetters({
    recruiters: 'company/recruiters'
  }),

}
</script>

company.js

import axios from 'axios'

// state
export const state = {
  recruiters: [],
}

// getters
export const getters = {
  recruiters: state => { 
    return state.recruiters
  }
}

// actions
export const actions = {
  GET_RECRUITERS(context) {

    axios.get("api/recruiters")
      .then((response) => {
        console.log('API Action GET_RECRUITERS')
        context.commit("GET_RECRUITERS", response.data.data) 
      })
      .catch(() => { console.log("Error........") })
  }

}

// mutations
export const mutations = {
  GET_RECRUITERS(state, data) {
    return state.recruiters = data
  }
}

谢谢!

这是预期的行为,因为页面组件在您每次路由回它时都会再次 created/mounted,除非您缓存它。这里有一些设计模式:

  • 加载App.vue中的数据,只运行一次

  • 或者,在进行 API 调用之前检查数据是否尚未加载:

// Testing that your `recruiters` getter has no length before loading data
mounted() {
   if(!this.recruiters.length) {
      this.$store.dispatch("company/GET_RECRUITERS");
   }
}
  • 或者,缓存页面组件,这样它就不会在您每次离开和返回时都重新创建。通过使用 <keep-alive> 组件来包装 <router-view>:
<keep-alive>
   <router-view :key="$route.fullPath"></router-view>
</keep-alive>