在我的项目中,我想将一些 Ajax 加载的菜单项添加到 Vue 中的 CoreUI 侧边栏。我已经找到了一个可行的解决方案,但它有点笨拙,并且可能存在时间问题。所以想请教一下,是否有合适的或者至少更好的解决方案。
我还发现了this question几天前,但还没有答案。
// main.js
new Vue({
el: '#app',
router,
icons,
template: '<App/>',
components: {
App
},
data: {
clientConfiguration: null
},
created: async function () {
let svcResult = await this.$http.get('Picking/ViewerSettings');
this.clientConfiguration = svcResult.data;
this.$children[0].$children[0].$children[0].$data.nav[0]._children[0].items =
svcResult.data.map(vc => ({
name: vc.name,
to: 'test/' + vc.name,
icon: 'cil-spreadsheet'
}));
}
})
// _nav.js
export default [
{
_name: 'CSidebarNav',
_children: [
{
_name: 'CSidebarNavDropdown',
name: 'Lists',
to: '/test',
icon: 'cil-list-numbered',
items: []
},
// ...
]
}
]
最佳答案
_nav.js 文件只是可以由 CRenderFunction 组件渲染的数据结构的示例 docs
CRenderFunction 背后的想法是您可以从数组/对象中渲染组件。
就您的情况而言,您有两种选择:
- 在后端生成 CRenderFunction 对象,
- 根据从后端获取的数据,通过计算属性在前端生成 CRenderFunction 对象
这是第二种方法的示例:
在模板中
<CRenderFunction flat :content-to-render="navItems"/>
在脚本中:
//example array that you receive from backend
const menuItems = [
{
name: 'first item',
to: '/first',
icon: 'cil-user'
},
{
name: 'second item',
to: '/second'
},
{
name: 'third item',
to: '/third'
}
]
export default {
computed: {
navItems () {
return [
{
_name: 'CSidebarNav',
_children: this.sidebarNavChildren
}
]
},
sidebarNavChildren () {
return menuItems.map(menuItem => {
return {
_name: 'CSidebarNavItem',
name: menuItem.name,
to: menuItem.to,
icon: menuItem.icon || 'cil-spreadsheet'
}
})
}
}
}
navItems 计算属性结果:
[{"_name":"CSidebarNav","_children": [
{"_name":"CSidebarNavItem","name":"first item","to":"/first","icon":"cil-user"},
{"_name":"CSidebarNavItem","name":"second item","to":"/second","icon":"cil-spreadsheet"},
{"_name":"CSidebarNavItem","name":"third item","to":"/third","icon":"cil-spreadsheet"}
]
}]
关于javascript - 在Vue CoreUI中动态添加导航项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60521345/