【问题标题】:Dynamically add navigation items in Vue CoreUI在 Vue CoreUI 中动态添加导航项
【发布时间】:2020-03-04 07:56:49
【问题描述】:

在我的项目中,我想将一些 Ajax 加载的菜单项添加到 Vue 中的 CoreUI 侧边栏。我已经找到了一个可行的解决方案,但它有点 hacky 并且可能存在时间问题。因此,我想问您,是否有适当的或至少更好的解决方案。

我前几天也找到了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: []
            },
            // ...
        ]
    }
]

【问题讨论】:

    标签: javascript vue.js axios core-ui


    【解决方案1】:

    _nav.js文件只是CRenderFunction组件docs可以渲染的数据结构的一个例子@

    CRenderFunction 背后的想法是您可以从 Array/Object 渲染组件。

    在你的情况下,你有两个选择:

    • 在后端生成 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"}
     ]
    }]
    

    【讨论】:

    • 您好.. 我也有同样的问题.. 在您回答之后,我认为我理解得更好,一切似乎都合乎逻辑。我已经按照你的描述做了,但没有任何反应..没有错误,但也没有渲染菜单
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多