根据nuxt中的url参数动态加载组件

时间:2018-07-16 09:45:09

标签: vue.js vue-component nuxt.js

我在nuxt中有一个页面,该页面分为两部分。第一部分是一个普通的模板结构,其中填充了基于url参数的动态内容。第二部分是应基于此数据加载的组件。我正在尝试像这样完成它:

  

<脚本>
导出默认值{
  组件: {
    'my-component':()=> import('@ / components'+ this.myData.component)
  },
  异步asyncData(context){
    返回{
      myData:context.params.myData
    }
  }
}

 

但这不起作用。有没有办法做到这一点?

我熟悉使用 的可能性。但是,这需要我显式导入每个组件,并且我想避免这种情况。

3 个答案:

答案 0 :(得分:6)

昨天我找到了解决方案。它需要像这样完成。

<template>
<div>
    <h1>{{myData.header}}</h1>
    <p>{{myData.text}}</p>
    <component :is="componentInstance"></component>
</div>
</template>

<script>
export default {
    computed: {
        componentInstance () {
        const name = this.myData.component
        return () => import(`./components/${name}`)
        }
    },
    async asyncData(context) {
        return {
        myData: context.params.myData
        }
    }
}
</script>

本文中的更多信息:https://itnext.io/vue-a-pattern-for-idiomatic-performant-component-registration-you-might-not-know-about-9f3c091846f5

答案 1 :(得分:1)

根据Imre_G的回答,可以将其简化如下:

<template>
  <div>
    <h1>Hi</h1>
    <p>Hello World!</p>
    <Component :is="component"></Component>
  </div>
</template>

<script>
export default {
  computed: {
    component() {
      return () =>
        import(`../../__relative_path__/${this.$route.params.yourParam}`)
    }
  }
}
</script>

答案 2 :(得分:0)

如果您需要导入现有组件,我找到了一种简单的方法。我这样做是因为我使用的是 Nuxt,我只需要在客户端加载组件:

<template>
  <my-component></my-component>
</template>

<script>
  data() {
    return {...}
  },
  mounted() {
    if (process.browser) {
      const component = require("~/assets/libs/component");
      Vue.use("my-component", component); // or just Vue.use(component);
    }
  }
</script>

此方法避免了与Window实例相关的导入错误。