nuxt中根据url参数动态加载组件
Load component dynamically based on url parameters in nuxt
我在 nuxt 中有一个页面分为两部分。第一部分是一个普通的模板结构,其中填充了基于 url 参数的动态内容。第二部分是应该基于此数据加载的组件。我正在尝试这样完成它:
<template>
<div>
<h1>{{myData.header}}</h1>
<p>{{myData.text}}</p>
<my-component></my-component>
</div>
</template>
<script>
export default {
components: {
'my-component': () => import('@/components' + this.myData.component)
},
async asyncData(context) {
return {
myData: context.params.myData
}
}
}
</script>
但这不起作用。有没有办法做到这一点?
我熟悉使用 <my-component :is="myData.component"></my-component>
的可能性。但是,这需要我显式导入每个组件,我想避免这种情况。
我昨天找到了解决办法。它需要这样做。
<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>
根据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>
如果您需要导入现有组件,我发现了一种简单的方法。我这样做是因为我使用的是 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 实例相关的导入错误。
我在 nuxt 中有一个页面分为两部分。第一部分是一个普通的模板结构,其中填充了基于 url 参数的动态内容。第二部分是应该基于此数据加载的组件。我正在尝试这样完成它:
<template>
<div>
<h1>{{myData.header}}</h1>
<p>{{myData.text}}</p>
<my-component></my-component>
</div>
</template>
<script>
export default {
components: {
'my-component': () => import('@/components' + this.myData.component)
},
async asyncData(context) {
return {
myData: context.params.myData
}
}
}
</script>
但这不起作用。有没有办法做到这一点?
我熟悉使用 <my-component :is="myData.component"></my-component>
的可能性。但是,这需要我显式导入每个组件,我想避免这种情况。
我昨天找到了解决办法。它需要这样做。
<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>
根据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>
如果您需要导入现有组件,我发现了一种简单的方法。我这样做是因为我使用的是 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 实例相关的导入错误。