vue.js - VueJS 动态路由和组件
问题描述
使用 cue-cli 3. 是否可以这样做(router.js):
axios.get( `${process.env.VUE_APP_API_DOMAIN}/wp-json/api/v1/routes`).then( r => r.data ).then(routes => {
routes.pages.forEach( (e) => {
router.addRoutes([
{
path: `/${e.slug}`,
component: e.template,
},
]);
});
});
e.template is a string 'Default' and of course VueJS says:
route config "component" for path: /privacy-policy cannot be a string id. Use an actual component instead.
Tried with Vue.component(e.template)
no luck.
What I want to do here is create dynamic routes based on XHR response.
Here is all router.js code:
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import Default from './views/Default.vue'
import Test from './views/Test.vue'
import axios from "axios";
Vue.use(Router);
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: Home
},
]
});
axios.get( `${process.env.VUE_APP_API_DOMAIN}/wp-json/api/v1/routes`).then( r => r.data ).then(routes => {
routes.pages.forEach( (e) => {
router.addRoutes([
{
path: `/${e.slug}`,
component: e.template,
},
]);
});
});
export default router;
解决方案
如果e.template
存储模板字符串,
您应该将其包装为一个选项对象,例如{template: e.template, props: {}, data: function () {} }
,然后调用Vue.extend
以构造组件。
或者你可以忽略Vue.extend
,因为 Vue 会调用Vue.extend
自动构建组件。
在 Vue 指南中查看用法:Vue.component
OP 状态的编辑e.tempate
是一个组件名称:
如果e.template
是组件的名称,则使用Vue.component(e.template)
.
Vue.config.productionTip = false
const router = new VueRouter({
routes: [
]
})
Vue.component('test', {
template: '<div>I am Predefined component -> {{index}}</div>',
props: ['index']
})
let routerIndex = 1
setInterval(()=> {
let newComponent = routerIndex%2 ? {template: '<div>I am User -> {{index}}</div>', props: ['index']} : Vue.component('test')
router.addRoutes([{
path: '/Test' + routerIndex,
name: 'Test' + routerIndex,
component: newComponent,
props: { index: routerIndex }
}])
console.log('add route = ', '/Test' + routerIndex, ' by ', routerIndex%2 ? 'options object' : 'Vue.component')
routerIndex++
}, 2000)
Vue.use(VueRouter)
app = new Vue({
el: "#app",
router,
data: {
routeIndex: 0
},
watch: {
routeIndex: function (newVal) {
this.$router.push({'name': 'Test'+newVal})
}
}
})
div.as-console-wrapper {
height: 100px;
}
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<p>Current Route Index: {{routeIndex}}</p>
Test Route: <input v-model="routeIndex" type="number">
<router-view></router-view>
</div>
推荐阅读
- php - PHP:在 Laravel 中解析 Web API 响应
- c# - 1 类对象作为另一个类(2 类)的属性。如何通知财产变更
- hyperledger-fabric - 如何解决“错误:查询期间背书失败。响应:状态:500 消息”?
- c - 运行错误代码之前的段错误
- c++ - C++ 从 DLL 导出数组以在基于 C 的程序中调用/使用
- vue.js - 为什么 Vue 在语言路径中抛出错误?
- vb.net - VB.NET 使对象的方法只能被某些其他对象访问
- python - python scikit-learn:搜索树后如何修改 LeafNode 的数据
- javascript - 如何使用 SSR 完全预加载 React 站点?
- office365 - GroupsActivityDetail 报告中缺少 GroupID