【问题标题】:Group multiple requests using Vuex使用 Vuex 对多个请求进行分组
【发布时间】:2020-04-16 06:56:10
【问题描述】:

目前我们有 Vue + Vuex 应用程序,每个页面使用大量自定义组件。我们使用 MongoDB 作为数据库。

每个组件从 API 端点加载一些初始化数据:

async loadData() {
  const data = await getData('/api/some_url', {path_in_db: 'some.path.to.db')
}

现在我们遇到了一个问题,即在页面初始化期间有超过 50 个请求发送到后端服务器。

我尝试做的事情:

创建 Vuex 商店

import { INITIAL_DATA_GET, INITIAL_DATA_SET, INITIAL_DATA_CLEAR } from './actions';

const getDefaultState = () => {
  return {};
};

const mutations = {
  [INITIAL_DATA_SET]: (mutationState, obj) => {
    const { request = {} } = mutationState;
    if (!request[obj.ref]) {
      request[obj.ref] = { paths: [] };
    }
    request[obj.ref].paths.push(obj.resPath);
    Vue.set(mutationState, 'request', request);
  },
  [INITIAL_DATA_CLEAR]: (mutationState) => {
    Vue.set(mutationState, getDefaultState());
  },
};

const actions = {
  [INITIAL_DATA_SET]: ({ commit }, obj) => {
    commit(INITIAL_DATA_SET, obj);
  },
  [INITIAL_DATA_CLEAR]: ({ commit }) => {
    commit(INITIAL_DATA_CLEAR);
  },
};

const getters = {
  [INITIAL_DATA_GET]: getterState => getterState,
};

从我运行的每个组件

store.dispatch(INITIAL_DATA_SET, {
  ref: this.ref,
  resPath: this.resPath,
});

所有组件初始化后,最后一个console.log(mutationState)看起来像这样

getters: {
  request: {
    5d879e7af0a317002e5b4759: {
       paths: ['path.to.a', 'path.to.b', 'path.to.c'...]
    }
  }
}

我的问题是:

  • 有什么方法可以等待所有组件加载完毕,然后才向数据库发送一个请求?
  • 实现此类(获取多个请求)的最佳做法是什么?
  • 最佳方案是什么:发送一个大请求还是多个小请求?

【问题讨论】:

    标签: mongodb vue.js vuex


    【解决方案1】:

    在处理异步操作后等待多个子组件完全加载时,您可能希望使用$emit 设置组件准备就绪的标志。一旦你的父母检测到所有孩子都准备好了,你就可以触发任何你想要的东西。这通常在使用骨架组件和微调器时使用。

    根据您的需要,可以通过不同的方式发出多个异步请求。如果您只想快速轻松地处理,请将它们全部分组到 Promise.all 数组中,然后一次性完成。如果顺序很重要,那么您可以根据需要在 Promises 中将它们一起批处理。

    没有真正的“最佳”方案。如果您有带宽并使用良好的 UI/UX 实践,您可以单独或批量发送它们。如果您的顶级组件组件花费的时间更少,请先调用这些组件,然后再调用较低的组件,以便用户更快地进行交互。有很多方法可以做到这一点。

    但是,如果您在初始化时对后端服务器进行了 50 次调用,那么您的服务器设置是否正确?端点是否有效?你能从正面做的只有这么多。

    【讨论】:

    • 我知道$emit,但这确实不适合满足需求。我们真正的问题是我们有例如具有多个部分的页面,每个部分可能有多个组件。所有这些部分和组件都是动态的,因此我们不确切知道我们需要数据库中的哪些信息。例如:假设我们的数据库结构看起来像level1: {level2: {level3:{}}} etc 目前要处理多个请求,我们只需加载level1,然后通过props 将这个大的JSON 对象传递给孩子。但我想这在level1 方面并不好,可能非常大......
    • 我在考虑使用Promise.all。但是你认为这可以如何使用 Vuex 来实现?这仍然是多个请求吗?如果是这样,这不是我们的解决方案,因为在 mounted 事件上的实现看起来更好,并且在组件方面可以更好地隔离。
    • 如果您在第一级有大量 JSON 进入并向下传递多个级别,听起来您最好使用 Vuex 并将数据保存在存储中以供任何组件访问.
    • Promise.all 在商店中的工作方式相同。您可以将异步函数放入操作中,然后提交。您甚至可以在挂载时或任何时候在组件中进行异步获取,并在获取数据后将其存储在状态中。
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2015-12-11
    • 2023-03-02
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多