【问题标题】:Preload Multiple Fetch Calls in Vue 3 App在 Vue 3 应用程序中预加载多个 Fe​​tch 调用
【发布时间】:2021-09-06 07:31:14
【问题描述】:

我有一个相对较小的应用程序,我想在该应用程序最初加载时调用多个 api 并存储这些结果(不带 Vuex),以便可以通过提供/注入子组件使其可用。

目前在我的 App.vue 中,我有这个:

export default {
  setup() {
    const data = ref([]);
    const issues = ref([]);

    (async () => {
      const res = await fetch("/api/lists").then({ data });
      data.value = await res.json();
      data.value =
        data.value &&
        data.value.data.map((c) => {
          return { ...c.attributes, id: c.id };
        });
    })();
    (async () => {
      const res = await fetch("/api/issues").then({ issues });
      issues.value = await res.json();
      issues.value =
        issues.value &&
        issues.value.data.map((c) => {
          return [{ ...c.attributes, id: c.id }];
        });
    })();
    provide("items", data);
    provide("issues", issues);

    return {};
  },
  components: {},

item 数据在子组件中 100% 的时间呈现。问题数据的呈现可能有 10% 的时间,我假设这是因为异步函数在提供语句运行之前没有完成。

我的问题是

  1. 有没有更好的方法来一次调用多个 fetch 语句并将这些结果分配给我可以“提供”的变量?
  2. 当用户第一次访问该站点并提供结果而无需每次用户在视图之间切换时重新获取时,预加载这些 api 调用的最佳方法是什么(我还需要实现大约 3 或 4 个)并且不使用 Vuex。

【问题讨论】:

    标签: vue.js vuejs3 fetch-api vue-composition-api


    【解决方案1】:

    你可以这样做:https://stackblitz.com/edit/vue-y5hetf

    Promise.all 用于并行运行 fetch 调用,而不是串行执行,这有助于提高性能。

    只要您在 App.vue 文件中执行这些请求,这些调用应该只在重新加载时发生,而不是在路由更改时发生。

    【讨论】:

    • 我试了一下,在我得到的控制台中,“[Vue 警告]:provide() 只能在 setup() 中使用。”并且没有渲染。
    • 你说得对,我已经更新了我的答案并添加了一个 Stackblitz 演示,现在可以使用了。
    • 该更新肯定修复了警告,但由于某种原因,我仍然只有大约 10% 的时间将“问题”数据发送给子组件。只是为了提供更多见解,我正在构建一个数据表,我将问题数据中的几列添加到项目数据中,然后呈现一个表。
    • 在 stackblitz 中它工作得非常可靠。我还添加了超时以在几秒钟后重置问题数组以检查反应性。一切似乎都很好。所以它可能与映射有关。
    • 我也开始这么想了。我正在使用 MirageJS 来获取数据,它正在将字段添加到我不会在生产中获得的数据中。我正在做那个映射来尝试规范化数据。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 2020-12-13
    • 2020-04-15
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2020-10-25
    • 2021-03-19
    相关资源
    最近更新 更多