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 | <template> | 1 | <template> |
| 2 | <div> | 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 | <Menu-item name="1"> | 4 | <Menu-item name="1"> |
| 5 | <Icon type="ios-paper"></Icon> | 5 | <Icon type="ios-paper"></Icon> |
| 6 | 一级1 | 6 | 一级1 |
| @@ -41,6 +41,22 @@ | @@ -41,6 +41,22 @@ | ||
| 41 | </MenuItem> | 41 | </MenuItem> |
| 42 | </MenuGroup> | 42 | </MenuGroup> |
| 43 | </Submenu> | 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 | </Submenu> | 60 | </Submenu> |
| 45 | </Submenu> | 61 | </Submenu> |
| 46 | <Menu-item name="4"> | 62 | <Menu-item name="4"> |
src/components/menu/menu.vue
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | <ul :class="classes" :style="styles"><slot></slot></ul> | 2 | <ul :class="classes" :style="styles"><slot></slot></ul> |
| 3 | </template> | 3 | </template> |
| 4 | <script> | 4 | <script> |
| 5 | - import { oneOf, findComponentsDownward } from '../../utils/assist'; | 5 | + import { oneOf, findComponentsDownward, findBrothersComponents } from '../../utils/assist'; |
| 6 | import Emitter from '../../mixins/emitter'; | 6 | import Emitter from '../../mixins/emitter'; |
| 7 | 7 | ||
| 8 | const prefixCls = 'ivu-menu'; | 8 | const prefixCls = 'ivu-menu'; |
| @@ -82,7 +82,14 @@ | @@ -82,7 +82,14 @@ | ||
| 82 | } else { | 82 | } else { |
| 83 | this.openNames.push(name); | 83 | this.openNames.push(name); |
| 84 | if (this.accordion) { | 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 | this.openNames.push(name); | 93 | this.openNames.push(name); |
| 87 | } | 94 | } |
| 88 | } | 95 | } |
src/components/menu/submenu.vue
| 1 | <template> | 1 | <template> |
| 2 | <li :class="classes" @mouseenter="handleMouseenter" @mouseleave="handleMouseleave"> | 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 | <slot name="title"></slot> | 4 | <slot name="title"></slot> |
| 5 | <Icon type="ios-arrow-down" :class="[prefixCls + '-submenu-title-icon']"></Icon> | 5 | <Icon type="ios-arrow-down" :class="[prefixCls + '-submenu-title-icon']"></Icon> |
| 6 | </div> | 6 | </div> |
| @@ -112,7 +112,7 @@ | @@ -112,7 +112,7 @@ | ||
| 112 | if (this.mode === 'horizontal') return; | 112 | if (this.mode === 'horizontal') return; |
| 113 | const opened = this.opened; | 113 | const opened = this.opened; |
| 114 | if (this.accordion) { | 114 | if (this.accordion) { |
| 115 | - this.parent.$children.forEach(item => { | 115 | + this.$parent.$children.forEach(item => { |
| 116 | if (item.$options.name === 'Submenu') item.opened = false; | 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,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 | /* istanbul ignore next */ | 241 | /* istanbul ignore next */ |
| 232 | const trim = function(string) { | 242 | const trim = function(string) { |
| 233 | return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, ''); | 243 | return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, ''); |