看 https://github.com/vuejs/vue/tree/dev/examples/tree
超简单的demo,主要理解递归组件。暂时保存一下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Vue.js tree view example</title>
<style>
body {
font-family: Menlo, Consolas, monospace;
color: #444;
}
.item {
cursor: pointer;
}
.bold {
font-weight: bold;
display: inline-block;
position: relative;
}
.show {
position: absolute;
left: -30px;
}
.main:hover .add{
display: inline-block;
}
.add {
display: none;
}
ul {
margin-top: 0;
line-height: 1.5em;
list-style-type: none;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id='app'>
<md-tree class="item" :model="treeData"></md-tree>
</div>
<script type="text/javascript">
Vue.component('MdTree', {
name: 'md-tree',
props: {
model: Object
},
data () {
return {
open: false
}
},
computed: {
isFolder () {
return this.model.children &&
this.model.children.length
}
},
template : `
<li>
<div
:class="{bold: isFolder}" class="main">
<span class="show" v-if="isFolder" @click="toggle">[{{open ? '-' : '+'}}]</span>
{{model.name}}
<span @click="addChild(model)" v-if="model.name !== '根节点'" class="add"> + </span>
</div>
<ul v-show="open" v-if="isFolder">
<md-tree
class="item"
v-for="(model, index) in model.children"
:key="index"
:model="model">
</md-tree>
</ul>
</li>`,
methods: {
toggle: function () {
if (this.isFolder) {
this.open = !this.open
}
},
changeType: function () {
if (!this.isFolder) {
Vue.set(this.model, 'children', [])
this.addChild()
this.open = true
}
},
addChild (model) {
if (model.children) {
model.children.push({name: '新节点'})
this.open = true
} else {
Vue.set(model, 'children', [
{name: '新节点'}
])
this.open = true
}
console.log(model)
}
}
});
var app = new Vue({
el : '#app',
data () {
return {
treeData: {
name: '根节点',
children: [
{ name: '节点1' },
{ name: '节点2' },
{
name: '节点3',
children: [
{
name: '节点3.1',
children: [
{ name: '节点3.1.1' },
{ name: '节点3.1.2' }
]
},
{ name: '节点3.2' },
{ name: '节点3.3' },
{
name: '节点3.4',
children: [
{ name: '节点3.4.1' },
{ name: '节点3.4.2' }
]
}
]
}
]
}
}
}
});
</script>
</body>
</html>