在本篇文章当中,将采用vue+iview的tree组件实现树型结构。
要实现这种自定义效果其实不难,而且官网有相应的实例代码,如下所示:
<template>
<Tree :data="data5" :render="renderContent"></Tree>
</template>
<script>
export default {
data () {
return {
data5: [
{
title: 'parent 1',
expand: true,
render: (h, { root, node, data }) => {
return h('span', {
style: {
display: 'inline-block',
width: '100%'
}
}, [
h('span', [
h('Icon', {
props: {
type: 'ios-folder-outline'
},
style: {
marginRight: '8px'
}
}),
h('span', data.title)
]),
h('span', {
style: {
display: 'inline-block',
float: 'right',
marginRight: '32px'
}
}, [
h('Button', {
props: Object.assign({}, this.buttonProps, {
icon: 'ios-add',
type: 'primary'
}),
style: {
width: '64px'
},
on: {
click: () => { this.append(data) }
}
})
])
]);
},
children: [
{
title: 'child 1-1',
expand: true,
children: [
{
title: 'leaf 1-1-1',
expand: true
},
{
title: 'leaf 1-1-2',
expand: true
}
]
},
{
title: 'child 1-2',
expand: true,
children: [
{
title: 'leaf 1-2-1',
expand: true
},
{
title: 'leaf 1-2-1',
expand: true
}
]
}
]
}
],
buttonProps: {
type: 'default',
size: 'small',
}
}
},
methods: {
renderContent (h, { root, node, data }) {
return h('span', {
style: {
display: 'inline-block',
width: '100%'
}
}, [
h('span', [
h('Icon', {
props: {
type: 'ios-paper-outline'
},
style: {
marginRight: '8px'
}
}),
h('span', data.title)
]),
h('span', {
style: {
display: 'inline-block',
float: 'right',
marginRight: '32px'
}
}, [
h('Button', {
props: Object.assign({}, this.buttonProps, {
icon: 'ios-add'
}),
style: {
marginRight: '8px'
},
on: {
click: () => { this.append(data) }
}
}),
h('Button', {
props: Object.assign({}, this.buttonProps, {
icon: 'ios-remove'
}),
on: {
click: () => { this.remove(root, node, data) }
}
})
])
]);
},
append (data) {
const children = data.children || [];
children.push({
title: 'appended node',
expand: true
});
this.$set(data, 'children', children);
},
remove (root, node, data) {
const parentKey = root.find(el => el === node).parent;
const parent = root.find(el => el.nodeKey === parentKey).node;
const index = parent.children.indexOf(data);
parent.children.splice(index, 1);
}
}
}
</script>
可以从官网的示例代码中发现,如果要自定义树型控件内容的话,需要采用render函数,该Render函数的第二个参数包含三个字段,分别为根节点、当前节点、当前节点的数据。
在data数据里面的render设置的自定义根节点,而通过bind绑定的render则是用来自定义子节点的,而文章开头展示的效果图当中,要实现的效果根节点和子节点的样式是一样的,所以在这可以共用一个render函数。
//公共的render函数
renderContent (h, { root, node, data }) {
return h('span', {
style: {
display: 'inline-block',
width: '100%'
}
}, [
h('span', [
h('img', {
attrs:{
src:data.src //图片的地址
},
style: {
verticalAlign: "middle",
display:"inline-block",
margin:'0px 5px'
}
}),
h('span', data.subprojectName) //subprojectName属性存放的是需要显示的文本信息
])
]);
}
从代码中可以看出,这个公共的render也就是实现了图片后面跟上文本信息,图片的src存放在数据当中的src属性中,文本信息存放在subprojectName属性中。
在iview的官方示例当中,还存在着可以勾选多选以及子菜单延迟加载的功能,延迟加载也就是去请求API将数据返回了,具体的都可以直接参考官方示例。