背景:使用ant-design-vue进行开发。因为涉及到不知道多少层的数据显示,所以普通模板应该已经满足不了这个需求,正好看到有人的代码里面写了一个JSX的组件,于是参考自己改了一些
实现
import Menu from 'ant-design-vue/es/menu';
import Icon from 'ant-design-vue/es/icon';
import DropDown from 'ant-design-vue/es/dropdown';
const { Item, SubMenu } = Menu
// const { Button } = DropDown
export default {
name: 'CMenu',
props: {
menu: {
type: Array,
required: true
}
},
data () {
return {
selectedName: '请选择'
}
},
methods: {
renderItem (menu) {
return menu.children && menu.children.length > 0 ? this.renderSubMenu(menu) : this.renderMenuItem(menu)
},
setItem (e) {
// this.selectedName = e
let obj = { id: e.id, name: e.domEvent.target.innerText }
this.selectedName = obj.name
localStorage.setItem('selectedRegion', JSON.stringify(obj))
this.$emit('regionChange', obj)
},
renderMenuItem (menu) {
return (
<Item {...{ key: menu.id, title: menu.name }} vOn:click={this.setItem}>
<span>{menu.name}</span>
</Item>
)
},
renderSubMenu (menu) {
const itemArr = []
menu.children.forEach(item => {
itemArr.push(this.renderItem(item))
});
return (
<SubMenu {...{ key: menu.id, title: menu.name }}>
<span slot="title">{menu.name}</span>
{itemArr}
</SubMenu>
)
}
},
render () {
const { menu } = this
const menuTree = menu.map(item => {
return this.renderItem(item)
})
return (
<div class="center">
<DropDown>
<a vOn:click={e => e.preventDefault()} style="color:#333;">
{this.selectedName}
<Icon type="down" class="m-l-10"></Icon>
</a>
<Menu slot="overlay">
{menuTree}
</Menu>
</DropDown>
</div>
)
}
}
使用
<c-menu :menu="regions" @regionChange="regionChange"></c-menu>