javascript - 在Vue CoreUI中动态添加导航项

标签 javascript vue.js axios core-ui

在我的项目中,我想将一些 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/

相关文章:

javascript - React-select : weird look inside of react-table filter cell, 是 CSS 的问题吗?

post - 如何在 NestJS 中使用 HttpModule 发布表单数据

javascript null 比较在 Chrome 和 Firefox 上不同

Javascript使用数组中的值替换字符串中的字符串

javascript - VueJS 从方法访问模型

vue.js - Vuex this.$store 在子组件中未定义

node.js - 在 React JS 中存储 API 根 Url 的最佳位置是什么?

node.js - 从子进程到 API 的请求导致 ECONNRESET

javascript - 注入(inject)脚本错误 : Script returned non-structured-clonable data on Firefox extension

javascript - 如何将数据从 Vue 实例传递到单个文件组件