MenuTree1.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { Menu, Icon, Input } from 'ant-design-vue'
  2. const { Item, ItemGroup, SubMenu } = Menu
  3. const { Search } = Input
  4. export default {
  5. name: 'MenuTree',
  6. props: {
  7. dataSource: {
  8. type: Array,
  9. required: true
  10. },
  11. openKeys: {
  12. type: Array,
  13. default: () => []
  14. },
  15. search: {
  16. type: Boolean,
  17. default: false
  18. }
  19. },
  20. created () {
  21. this.localOpenKeys = this.openKeys.slice(0)
  22. },
  23. data () {
  24. return {
  25. localOpenKeys: []
  26. }
  27. },
  28. methods: {
  29. handlePlus (item) {
  30. this.$emit('add', item)
  31. },
  32. handleMinus (item) {
  33. this.$emit('minus', item)
  34. },
  35. renderSearch () {
  36. return (
  37. <Search
  38. placeholder="input search text"
  39. style="width: 100%; margin-bottom: 1rem"
  40. />
  41. )
  42. },
  43. renderIcon (icon) {
  44. return icon && (<Icon type={icon} />) || null
  45. },
  46. renderMenuItem (item) {
  47. return (
  48. <Item key={item.key}>
  49. { this.renderIcon(item.icon) }
  50. { item.title }
  51. <a class="btn" style="width: 20px;z-index:1300" {...{ on: { click: () => this.handlePlus(item) } }}><a-icon type="plus"/></a>
  52. <a class="btn" style="width: 20px;z-index:1300" {...{ on: { click: () => this.handleMinus(item) } }}>
  53. <a-icon type="minus"/>
  54. </a>
  55. </Item>
  56. )
  57. },
  58. renderItem (item) {
  59. return item.children ? this.renderSubItem(item, item.key) : this.renderMenuItem(item, item.key)
  60. },
  61. renderItemGroup (item) {
  62. const childrenItems = item.children.map(o => {
  63. return this.renderItem(o, o.key)
  64. })
  65. return (
  66. <ItemGroup key={item.key}>
  67. <Item key={item.key}>
  68. { this.renderIcon(item.icon) }
  69. { item.title }
  70. <a class="btn" style="width: 20px;z-index:1300;right:30px" {...{ on: { click: () => this.handlePlus(item) } }}><a-icon type="plus"/></a>
  71. <a class="btn" style="width: 20px;z-index:1300" {...{ on: { click: () => this.handleMinus(item) } }}>
  72. <a-icon type="minus"/>
  73. </a>
  74. </Item>
  75. { childrenItems }
  76. </ItemGroup>
  77. )
  78. },
  79. renderSubItem (item, key) {
  80. const childrenItems = item.children && item.children.map(o => {
  81. return this.renderItem(o, o.key)
  82. })
  83. const title = (
  84. <span slot="title">
  85. { this.renderIcon(item.icon) }
  86. <span>{ item.title }</span>
  87. <a className="btn"
  88. style="width: 20px;z-index:1300;right:30px" {...{ on: { click: () => this.handlePlus(item) } }}><a-icon
  89. type="plus"/></a>
  90. <a className="btn" style="width: 20px;z-index:1300" {...{ on: { click: () => this.handleMinus(item) } }}>
  91. <a-icon type="minus"/>
  92. </a>
  93. </span>
  94. )
  95. // if (item.group) {
  96. // return this.renderItemGroup(item)
  97. // }
  98. // titleClick={this.handleTitleClick(item)}
  99. return (
  100. <SubMenu key={key}>
  101. { title }
  102. { childrenItems }
  103. </SubMenu>
  104. )
  105. }
  106. },
  107. render () {
  108. const { dataSource, search } = this.$props
  109. // this.localOpenKeys = openKeys.slice(0)
  110. const list = dataSource.map(item => {
  111. return this.renderItem(item)
  112. })
  113. return (
  114. <div class="tree-wrapper">
  115. { search ? this.renderSearch() : null }
  116. <Menu mode="inline" class="custom-tree" {...{ on: { click: item => this.$emit('click', item), 'update:openKeys': val => { this.localOpenKeys = val } } }} openKeys={this.localOpenKeys}>
  117. { list }
  118. </Menu>
  119. </div>
  120. )
  121. }
  122. }