vuex 如何做到 只有组件用到某个数据,才去发送请求?

发布于 2022-09-13 00:37:03 字数 363 浏览 9 评论 0

比如 vuex 中有一个城市列表

{
  cityList:[]
}

这个列表的数据是从后台返回的,常规做法是在整个页面第一次加载的时候发送请求,然后commit保存到vuex中。但是页面第一次初始化的时候,是没有用到这个数据的,所以我想问一下有没有方法能够让组件在真正使用到这个数据的时候,发现这个数据是空才去加载,而不是页面初始化的时候就去加载。
我知道可以在使用这个组件的时候用watch 监听 cityList,如果 cityList 为空才去发送请求,但是这样子有一个缺点,假如我有好多个组件都需要使用这个cityList,那我每一个组件都要监听一次 cityList 然后判断是否为空才去发送请求?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

戴着白色围巾的女孩 2022-09-20 00:37:03
// initial state
const state = {
  cityList: [],
}

// getters
const getters = {

}

let loading = false;

// actions
const actions = {
  async LoadCitys(store) {
    const cityList = store.state.cityList;
    if (loading || cityList.length > 0) return cityList;

    loading = true;

    return new Promise(resolve => {
      setTimeout(() => {
        store.commit('SET_CITY_LIST', [1, 2, 3]);
        loading = false;
        resolve(store.state.cityList);
      }, 1e3);
    });
  },
}

// mutations
let mutations = {}

mutations['SET_CITY_LIST'] = function (state, r) {
  state.cityList = r
}

export default {
  state,
  getters,
  actions,
  mutations
}

<template>
  <div>
    cityList: {{ cityList }}
  </div>
</template>

<script>
  export default {
    computed: {
      cityList() {
        return this.$store.state.citys.cityList;
      }
    },
    created() {
      this.$store.dispatch('LoadCitys');
    },
  }
</script>
明媚殇 2022-09-20 00:37:03

在需要用到的组件中:

import { mapState, mapActions } from 'vuex'

export default {
  computed: {
    ...mapState(['cityList'])
  },
  mounted () {
    if (!this.cityList || this.cityList.length === 0) {
      this.getCityList()
    }
  },
  methods: {
    ...mapActions(['getCityList'])
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文