动态 router.addRoutes 导入组件的问题

Posted

技术标签:

【中文标题】动态 router.addRoutes 导入组件的问题【英文标题】:Issue with dynamicallly router.addRoutes importing Component 【发布时间】:2019-12-05 12:25:50 【问题描述】:

我目前正在使用 Laravel 作为后端来玩 Vue。 我设置了一个页面模型,每个页面都可以有“孩子”。

现在我正在尝试为 vue-router 动态构建路由。

注意:这是我 Blade 模板中的内联脚本,没有 webpack 或 babel!

    <body>
        <div id="app">
        <router-link v-for="route in routes" :to="route.path" :key="route.name">@route.name
            <router-link  v-for="child in route.children" :to="child.path" :key="child.name">@child.name</router-link>
        </router-link>
        <router-view></router-view>
        </div>
    </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script src="https://unpkg.com/axios@0.2.1/dist/axios.min.js"></script>

<script type="module">
Vue.use(VueRouter);
let routes = [];

const router = new VueRouter( routes);

window.app = new Vue(
    el: '#app',
    router,
    created()
        axios.get('/pages').then(r => this.createRouting(r));
    ,
    methods:
        createRouting(pages)
           let vm = this

           pages.forEach(function(page)
                vm.routes.push(vm.makeRoute(page))
           )
           vm.$router.addRoutes(vm.routes)

        ,
        makeRoute(page)
            let vm = this
            let route = 
            route.path = page.slug
            route.name = page.name
            route.component = () => import('/js/Test.js')
            if(page.children.length)
                route.children = []
                page.children.forEach(function(child)
                    route.children.push(vm.makeRoute(child))
                )
            
            return route
        
    
);
</script>

这工作,除了路由器视图不显示组件。 路由器链接按预期显示。而且我可以在 Vue 开发工具的 Routing 下看到所有的路由。

我尝试硬编码一条路线,以验证导入是否有效并动态添加其他路线。

let routes = [    
    
        path:'/',
        component:() => import('/js/Test.js')
    
];

这显示 / 路由上的测试组件,但所有其他路由显示空白路由器视图 &lt;!----&gt;

在 Vue Dev Tools 中,第一个路由的组件显示:

component:ƒ component()

所有其他路线显示:

component:ƒ ()

Test.js 组件:

let Test = Vue.component('Test',
    template:`<div>Foo</div>`
);
export default Test;

【问题讨论】:

【参考方案1】:

以防万一有人在 Google 中遇到此问题 这是他的工作原理:

<body>
        <div id="app">
        <router-link v-for="route in routes" :to="route.path" :key="route.name">@route.name
            <router-link  v-for="child in route.children" :to="child.path" :key="child.name">@child.name</router-link>
        </router-link>
        <router-view></router-view>
        </div>
    </body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script src="https://unpkg.com/axios@0.2.1/dist/axios.min.js"></script>

<script type="module">
Vue.use(VueRouter);
let routes = [];

const router = new VueRouter( routes);

window.app = new Vue(
    el: '#app',
    router,
    created()
        axios.get('/pages').then(r => this.createRouting(r));
    ,
    methods:
        createRouting(pages)
           let vm = this

           pages.forEach(function(page)
                vm.routes.push(vm.makeRoute(page))
           )
           vm.$router.addRoutes(vm.routes)

        ,
        makeRoute(page)
            let vm = this
            let route = 
            route.path = page.slug
            route.name = page.name
            route.component = () => import('/js/Test.js').then(m => m)
            if(page.children.length)
                route.children = []
                page.children.forEach(function(child)
                    route.children.push(vm.makeRoute(child))
                )
            
            return route
        
    
);
</script>

【讨论】:

以上是关于动态 router.addRoutes 导入组件的问题的主要内容,如果未能解决你的问题,请参考以下文章

router.addRoutes的一坑

elementUI-admin router.addRoutes 只显示固定路由,不显示动态路由解决办法

vue 实现动态路由

vue-router 动态添加 路由

Vue入门十路由的使用

vue新版router.addRoute基础用法