Vuex store 的多个实例

Posted

技术标签:

【中文标题】Vuex store 的多个实例【英文标题】:Multiple instances of Vuex store 【发布时间】:2022-01-19 11:08:24 【问题描述】:

我必须关注 vue2/vuex 的情况;假设我有一个用户模块,用于存储从我的 api 获取的所有用户。

我使用这个模块来填充,例如,包含所有用户的下拉列表。

现在我也有一个用户页面,但是这个页面有过滤、分页用户等选项。这发生在服务器端,因此模块将使用新的(过滤的)用户列表进行更新。

我应该为两个用例(usersOptions 和 usersView)创建两个单独的模块吗?对我来说,创建两个用户存储实例似乎更合乎逻辑,但显然这对于​​ Vuex 是不可能的。遇到这种情况你会怎么处理?

这是我的用户模块的示例:

import UserRepository from '@/repositories/UserRepository';

export default 
  namespaced: true,
  state: 
    loading: false,
    users: [],
  ,
  getters: 
    isLoading(state) 
      return state.loading;
    ,
    data(state) 
      return state.users;
    ,
    options: (state) => (value = 'id', label = 'name') => state.users.map(
      (user) => ( value: user[value], label: user[label] ),
    ),
  ,
  mutations: 
    SET_LOADING(state, payload) 
      state.loading = payload;
    ,
    SET_DATA(state, payload) 
      state.users = payload;
    ,
  ,
  actions: 
    fetch( commit ) 
      return new Promise((resolve, reject) => 
        commit('SET_LOADING', true);
        UserRepository.index( limit: 0 )
          .then((response) => 
            const users = response.data.data;
            commit('SET_DATA', users);
            resolve(response);
          )
          .catch((error) => 
            reject(error);
          )
          .finally(() => 
            commit('SET_LOADING', false);
          );
      );
    ,
  ,
;

【问题讨论】:

很难说不知道your code。这实际上取决于您如何在商店中保存数据。你能和我们分享一下吗? 我已经用我的用户模块示例更新了我的帖子。 谢谢!您能告诉我们您可以用来请求完整或过滤/分页数据的不同网址吗? 对于我将使用/api/users/search?limit=0 的选项和填充视图我将使用/api/users/search?limit15&page=1 并使用JSON 有效负载进行过滤或排序([field: "name", direction: "desc"]) 好的,我添加了这个作为答案。我没有添加对过滤器/排序的支持,但我想你会明白的。 【参考方案1】:

直觉上,我会做这样的事情。尚未测试,但它可能还没有准备好使用。

import UserRepository from '@/repositories/UserRepository';

export default 
  namespaced: true,
  state: 
    loading: false,
    users: [],
  ,
  getters: 
    isLoading(state) 
      return state.loading;
    ,
    data(state) 
      return state.users;
    ,
    usersView() 
      return state.users.view;
    ,
    usersOptions() 
      return state.users.options;
    ,
    options: (state) => (value = 'id', label = 'name') => state.users.map(
      (user) => ( value: user[value], label: user[label] ),
    ),
  ,
  mutations: 
    SET_LOADING(state, payload) 
      state.loading = payload;
    ,
    SET_DATA(state, key, payload) 
      state.users[key] = payload;
    ,
  ,
  actions: 
    fetch( commit , params) 
      return new Promise((resolve, reject) => 
        commit('SET_LOADING', true);
        UserRepository.index(params)
          .then((response) => 
            resolve(response.data.data);
          )
          .catch((error) => 
            reject(error);
          )
          .finally(() => 
            commit('SET_LOADING', false);
          );
      );
    ,
    fetchOptions() 
        this.dispatch('fetch',  limit: 0 ).then((users)             
            commit('SET_DATA', 'options', users);
        )
    ,
    fetchView() 
        this.dispatch('fetch',  limit: 15, page: 1 ).then((users)             
            commit('SET_DATA', 'view', users);
        )
    ,
  ,
;

【讨论】:

谢谢,这似乎是一个非常可靠的解决方案。 不客气。【参考方案2】:

在我看来,两个商店从来都不是灵魂, 尝试分离为 2 个模块。 在这里找到更多:https://vuex.vuejs.org/guide/modules.html

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 我刚刚意识到我一直在使用术语“商店”,而我应该使用术语“模块”。我已经更新了我原来的帖子。

以上是关于Vuex store 的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

模块 vs 多个 vuex 存储文件

vuex学习总结

Vuex 文档解读

与 Vuex、axios 和多个组件实例进行封装数据共享

vuex应用实例-this.$store.commit()触发

vuex