Commit a163daa07a51b694db6fe52bc9f5e3c50b8f866f
1 parent
3e3fba0e
Add logical treatment to 'accordion'
Showing
4 changed files
with
38 additions
and
5 deletions
Show diff stats
examples/routers/menu.vue
1 | 1 | <template> |
2 | 2 | <div> |
3 | - <Menu :theme="theme1" active-name="1" @on-select="handleSelect" @on-open-change="handleOpen" :open-names="openArr"> | |
3 | + <Menu :theme="theme1" active-name="1" accordion @on-select="handleSelect" @on-open-change="handleOpen" :open-names="openArr"> | |
4 | 4 | <Menu-item name="1"> |
5 | 5 | <Icon type="ios-paper"></Icon> |
6 | 6 | 一级1 |
... | ... | @@ -41,6 +41,22 @@ |
41 | 41 | </MenuItem> |
42 | 42 | </MenuGroup> |
43 | 43 | </Submenu> |
44 | + <Submenu name="3-3-4"> | |
45 | + <template slot="title"> | |
46 | + <Icon type="stats-bars"></Icon> | |
47 | + 三级4 | |
48 | + </template> | |
49 | + <Menu-item name="3-3-4-1">四级1</Menu-item> | |
50 | + <Menu-item name="3-3-4-2">四级2</Menu-item> | |
51 | + </Submenu> | |
52 | + </Submenu> | |
53 | + <Submenu name="3-4"> | |
54 | + <template slot="title"> | |
55 | + <Icon type="stats-bars"></Icon> | |
56 | + 二级4 | |
57 | + </template> | |
58 | + <Menu-item name="3-4-1">三级1</Menu-item> | |
59 | + <Menu-item name="3-4-2">三级2</Menu-item> | |
44 | 60 | </Submenu> |
45 | 61 | </Submenu> |
46 | 62 | <Menu-item name="4"> | ... | ... |
src/components/menu/menu.vue
... | ... | @@ -2,7 +2,7 @@ |
2 | 2 | <ul :class="classes" :style="styles"><slot></slot></ul> |
3 | 3 | </template> |
4 | 4 | <script> |
5 | - import { oneOf, findComponentsDownward } from '../../utils/assist'; | |
5 | + import { oneOf, findComponentsDownward, findBrothersComponents } from '../../utils/assist'; | |
6 | 6 | import Emitter from '../../mixins/emitter'; |
7 | 7 | |
8 | 8 | const prefixCls = 'ivu-menu'; |
... | ... | @@ -82,7 +82,14 @@ |
82 | 82 | } else { |
83 | 83 | this.openNames.push(name); |
84 | 84 | if (this.accordion) { |
85 | - this.openNames.splice(0, this.openNames.length); | |
85 | + let currentSubmenu = {}; | |
86 | + findComponentsDownward(this, 'Submenu').forEach(item => { | |
87 | + if (item.name === name) currentSubmenu = item; | |
88 | + }); | |
89 | + findBrothersComponents(currentSubmenu, 'Submenu').forEach(item => { | |
90 | + let index = this.openNames.indexOf(item.name); | |
91 | + this.openNames.splice(index, index >= 0 ? 1 : 0); | |
92 | + }); | |
86 | 93 | this.openNames.push(name); |
87 | 94 | } |
88 | 95 | } | ... | ... |
src/components/menu/submenu.vue
1 | 1 | <template> |
2 | 2 | <li :class="classes" @mouseenter="handleMouseenter" @mouseleave="handleMouseleave"> |
3 | - <div :class="[prefixCls + '-submenu-title']" ref="reference" @click="handleClick" :style="titleStyle"> | |
3 | + <div :class="[prefixCls + '-submenu-title']" ref="reference" @click.stop="handleClick" :style="titleStyle"> | |
4 | 4 | <slot name="title"></slot> |
5 | 5 | <Icon type="ios-arrow-down" :class="[prefixCls + '-submenu-title-icon']"></Icon> |
6 | 6 | </div> |
... | ... | @@ -112,7 +112,7 @@ |
112 | 112 | if (this.mode === 'horizontal') return; |
113 | 113 | const opened = this.opened; |
114 | 114 | if (this.accordion) { |
115 | - this.parent.$children.forEach(item => { | |
115 | + this.$parent.$children.forEach(item => { | |
116 | 116 | if (item.$options.name === 'Submenu') item.opened = false; |
117 | 117 | }); |
118 | 118 | } | ... | ... |
src/utils/assist.js
... | ... | @@ -228,6 +228,16 @@ export function findComponentsUpward (context, componentName) { |
228 | 228 | } |
229 | 229 | } |
230 | 230 | |
231 | +// Find brothers components | |
232 | +export function findBrothersComponents (context, componentName) { | |
233 | + let res = context.$parent.$children.filter(item => { | |
234 | + return item.$options.name === componentName; | |
235 | + }); | |
236 | + let index = res.indexOf(context); | |
237 | + res.splice(index, 1); | |
238 | + return res; | |
239 | +} | |
240 | + | |
231 | 241 | /* istanbul ignore next */ |
232 | 242 | const trim = function(string) { |
233 | 243 | return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, ''); | ... | ... |