如何获取组件取决于 vue 路由器参数?

Posted

技术标签:

【中文标题】如何获取组件取决于 vue 路由器参数?【英文标题】:How can I get component depends on vue router param? 【发布时间】:2019-01-10 14:06:54 【问题描述】:

我有一个组件Portfolio.vue,它有一个子组件Category.vue,我可以通过<router-link :to = " name: 'category', params: id: id "> 获得。 Category.vue 从路由器接收参数id。 在Category.vue 我想导入许多组件之一。例如,如果idCategory.vue 来自Portfolio.vue = 'google',那么我有id = 'google',我想在Category.vue 中导入组件google.vue 并在那里渲染它。

这是我的Portfolio.vuesn-p

<template>
    <div class = "categories">
                        <div
                                class = "category"
                                v-for = "(category, index) in categories"
                                :key = "index"
                        >
                            <div class = "category-title">category.name</div>
                            <div class = "category-description">category.description</div>
                            <div class = "category-portfolios">
                                <div
                                        class = "category-portfolio"
                                        v-for = "(portfolio, index) in category.portfolios"
                                        :key = "index"
                                >
                                    <router-link :to = " name: 'category', params:  slug: portfolio.slug ">
                                        portfolio.slug
                                    </router-link>

                                </div>
                            </div>
                        </div>
                    </div>
</template>

<script>
    export default 
        name: "portfolio",
        data() 
            return 
                pageName: 'Portfolio',
                categories: []
            
        ,
        mounted() 
            fetch('api/portfolio/index')
                .then(response => response.json())
                .then(json => this.categories = Object.assign(, json.categories))

                .catch(error => 
                    console.log(error);
                )

        
    
</script>

<style lang = "scss" scoped>

</style>

这是我的Category.vue

    <template>
        <div>
            slug
            <component
                    :is="currentTabComponent"
                    class="test"
            ></component> <!--this component should be rendered-->
        </div>
    </template>

    <script>
    // import this.$route.params.slug   from './components/portfolios/this.$route.params.slug' 
//this code is wrong, but the main idea is to import component

        export default 
            name: "category",
            data() 
                return 
                    slug: ''
                
            ,
            beforeCreate() 
                this.slug = this.$route.params.slug;
            ,
            computed: 
                // maybe here I should definded what component should I render. This was in example in Vue documentation
                currentTabComponent: function () 
                    return this.slug
                
            ,

        
    </script>

    <style scoped>

    </style>

还有我的google.vue 组件

<template>
    <div>
        <h1>This is google portfolio</h1>
    </div>
</template>

<script>
    export default 
        name: "google"
    
</script>

<style scoped>

</style>

我读了这个Load component/template depending on the route param vuejs,看了这个https://jsfiddle.net/wostex/yLu0uza8/2/和这个https://vuejs.org/v2/guide/components.html#Dynamic-Components,但我仍然不知道如何从文件夹/文件中导入特定的.vue组件,我如何声明这个特定的@987654343 @ 父组件中的组件 (Category.vue) 以及最后如何在父组件中呈现这个特定的 .vue 组件 (Category.vue) &lt;template&gt;&lt;/template&gt;

所以主要问题是如何通过路由器参数从组件数量中导入特定组件? 谢谢。

【问题讨论】:

【参考方案1】:

难道你不能让组件本身根据路由 ID 动态更改其内容吗?

【讨论】:

我该怎么做?内容应该在哪里? 而且每个子组件内部都会有很多静态html,而且设计不同 @YaroslavSaenko 很难说除了你的组件名称之外我没有任何代码或任何东西......【参考方案2】:

您可以使用dynamic components 并将id 参数as props 传递给您的路线。 类似的东西:

const Category = Vue.component('category', 
  name: 'category',
  template: '#category',
  props: ['id']
);

const router = new VueRouter(
  routes: [
     path: '/category/:id', name: 'category', component: Category, props: true ,
  ]
)

在模板中:

<template id="category">
  <div>
    <h3>Category :  id </h3>
    <component :is="id"></component>
  </div>
</template>

fiddle example

【讨论】:

以上是关于如何获取组件取决于 vue 路由器参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vue 3 中获取路由器的参数?

vue中如何不通过路由直接获取url中的参数

如果我在 vue 路由器中有多个带有输入字段的组件,我应该如何获取数据并将其存储在 vuex 中?

如何获取路由器未加载的组件中路由更改的当前路由参数

vue 如何获取路由详细内容信息

vue如何配置路由 获取路由的参数部分刷新页面缓存页面