Vue
by WILLIAM CORREA
HTML
<div id="app">
<app-menu v-bind="{ items }"></app-menu>
</div>
CSS
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
Vue
Vue.component('AppMenu', {
name: 'AppMenu',
props: {
items: {
type: Array,
required: true
},
level: {
type: Number,
default: () => 0
}
},
computed: {
next () {
if (!this.level) {
return 1
}
return this.level + 1
}
},
template: `<div>
<template v-for="(item, index) in items">
<div>
{{ item.label }} {{ level }}
</div>
<div v-if="isParent(item)">
<app-menu v-bind="{ items: item.children, level: next }"></app-menu>
</div>
</template>
</div>`,
methods: {
isParent (item) {
return Array.isArray(item.children)
}
}
})
new Vue({
el: "#app",
data: () => ({
items: [
{
label: 'Parent',
children: [
{
label: 'Kid',
children: [
{
label: 'Grand kid'
}
]
}
]
}
]
})
})