【问题标题】:Conditionally import a component in Vue Router有条件地在 Vue Router 中导入组件
【发布时间】:2021-05-01 20:33:42
【问题描述】:

我想有条件地在 vue 路由器中导入一个组件。这是我目前拥有的:

children: [
  {
    path: ':option',
    component: () => import('../components/Option1.vue'),
  },
],

根据:option 是什么,我想导入不同的组件(Option1.vue、Option2.vue 等)。我知道我可以放几个children,但我实际上需要在我的父组件中使用option 变量(如果路由有选项,我会进行测试)。

怎么可能做到这一点? 在此先感谢:)

【问题讨论】:

  • 您可以改为在路径中加载通用父组件:然后,在组件中访问this.$router.params中的option的值,然后有条件地加载所需的Option组件。
  • 这可能让我感兴趣,如何在 Option 组件中编写它?
  • <component v-bind:is=...> 是动态加载组件的方式。
  • 实际上它不起作用,因为在这个“Option.vue”中我必须导入所有选项。

标签: vue.js vue-router vuejs3


【解决方案1】:

您可以创建一个包含dynamic component 的加载器组件,而不是执行条件路由。在加载器中,您将根据路由参数有条件地延迟加载选项组件。这不仅在路由时更容易,您也不必手动导入任何内容,并且只会导入使用的选项。

步骤 1. 路由到选项加载器组件

路由器

{
  path: ':option',
  component: () => import('../components/OptionLoader.vue'),
}

第 2 步。 在该选项加载器模板中,使用一个动态组件,该组件将由名为 optionComponent 的计算确定:

OptionLoader.vue

<template>
  <component :is="optionComponent" />
</template>

第 3 步。创建一个计算延迟加载当前选项

OptionLoader.vue

export default {
  computed: {
    optionComponent() {
      return () => import(`@/components/Option${this.$route.params.option}.vue`);
    }
  }
}

这将加载名为“Option5.vue”的组件,例如,当option 路由参数为5 时。现在您有了一个延迟加载的选项加载器,并且不必手动导入每个选项。


编辑: OP 现在表示他正在使用 Vue 3。

Vue 3

对于 Vue 3,将计算值更改为使用 defineAsyncComponent:

OptionsLoader.vue

import { defineAsyncComponent } from "vue";
computed: {
  optionComponent() {
    return defineAsyncComponent(() =>
      import(`@/components/Option${this.$route.params.option}.vue`)
    );
  }
}

【讨论】:

    【解决方案2】:

    以下是适用于 VueJS3 的内容:

    <template>
      <component :is="userComponent"/>
    </template>
    
    <script>
    import { defineAsyncComponent } from 'vue';
    import { useRoute, useRouter } from 'vue-router';
    
    export default {
      computed: {
        userComponent() {
          const route = useRoute();
          const router = useRouter();
    
          const components = {
            first: 'Option1',
            second: 'Option2',
            third: 'OtherOption',
            fourth: 'DefaultOption',
          };
          if (components[route.params.option]) {
            return defineAsyncComponent(() => import(`./options/${components[route.params.option]}.vue`));
          }
          router.push({ path: `/rubrique/${route.params.parent}`, replace: true });
          return false;
        },
      },
    };
    </script>
    

    来源:https://v3.vuejs.org/guide/migration/async-components.html 对于带有“return”的行,可能会收到类似这样的错误消息: Syntax Error: TypeError: Cannot read property 'range' of null

    在这种情况下,这意味着您可能希望从 babel-eslint 迁移到 @babel/eslint-parser(来源:https://babeljs.io/blog/2020/07/13/the-state-of-babel-eslint#the-present)

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 2021-09-02
      • 2020-10-18
      • 2018-01-26
      • 2021-04-18
      • 2021-03-19
      • 2019-03-22
      • 2019-09-22
      • 2023-04-04
      相关资源
      最近更新 更多