Динамически добавлять элементы навигации в Vue CoreUI - PullRequest
1 голос
/ 04 марта 2020

В моем проекте я хочу добавить некоторые Ajax загруженные пункты меню на боковую панель CoreUI в Vue. Я уже нашел рабочее решение, но оно довольно хакерское и может иметь проблемы со временем. Поэтому я хочу спросить вас, есть ли правильное или хотя бы лучшее решение.

Я также нашел этот вопрос из нескольких дней go, но он не имеет ответа пока нет.

// 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: []
            },
            // ...
        ]
    }
]

1 Ответ

3 голосов
/ 05 марта 2020

Файл _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"}
 ]
}]
...