laravel-5 - 动态 router.addRoutes 导入组件的问题
问题描述
我目前正在使用 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 Dev Tools 中的 Routing 下看到所有路由。
我尝试对一条路线进行硬编码,以验证导入是否有效并动态添加其他路线。
let routes = [
{
path:'/',
component:() => import('/js/Test.js')
}
];
这显示 / 路由上的测试组件,但所有其他路由显示空白路由器视图
<!---->
在 Vue Dev Tools 中,第一个路由的组件显示:
component:ƒ component()
所有其他路线显示:
component:ƒ ()
Test.js 组件:
let Test = Vue.component('Test',{
template:`<div>Foo</div>`
});
export default Test;
解决方案
以防万一有人在谷歌中偶然发现这个是他的工作原理:
<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>
推荐阅读
- python - 根据特定条件将数据帧一列中的所有行转置为多列
- c# - 脚本任务错误:系统存储不足。服务器响应是:4.5.3。收件人过多 (AS780090)
- hive - 我们如何使用 URL 将数据加载到配置单元中
- struct - 如何在 Julia 中创建结构?
- android - 活动的 Edittext 自动填充覆盖在片段上可见
- java - Googlemaps V2:在 GeoJsonPolygon 上添加信息窗口
- microsoft-graph-api - 通过 Graph API 访问和创建团队聊天
- reactjs - react-setState 不清除文本框
- arrays - “() => x”类型中缺少属性“x”,但在“x”类型中是必需的
- next.js - NextJS - react-springy-parallax 不起作用