Commit b3b4134d8bc53a6901e64f7a25809e560230af01
1 parent
1f7c24bc
fixed https://github.com/iview/iview/issues/3298
Showing
2 changed files
with
79 additions
and
51 deletions
Show diff stats
examples/routers/menu.vue
1 | <template> | 1 | <template> |
2 | - <Menu active-name="1-2" :open-names="['1']" theme="dark"> | ||
3 | - <Submenu name="1"> | ||
4 | - <template slot="title"> | ||
5 | - <Icon type="ios-analytics"></Icon> | ||
6 | - Navigation One | ||
7 | - </template> | ||
8 | - <MenuGroup title="Item 1"> | ||
9 | - <MenuItem name="1-1">Option 1</MenuItem> | ||
10 | - <MenuItem name="1-2">Option 2</MenuItem> | ||
11 | - </MenuGroup> | ||
12 | - <MenuGroup title="Item 2"> | ||
13 | - <MenuItem name="1-3">Option 3</MenuItem> | ||
14 | - <MenuItem name="1-4">Option 4</MenuItem> | ||
15 | - </MenuGroup> | ||
16 | - </Submenu> | ||
17 | - <Submenu name="2"> | ||
18 | - <template slot="title"> | ||
19 | - <Icon type="ios-filing"></Icon> | ||
20 | - Navigation Two | ||
21 | - </template> | ||
22 | - <MenuItem name="2-1">Option 5</MenuItem> | ||
23 | - <MenuItem name="2-2">Option 6</MenuItem> | ||
24 | - <Submenu name="3"> | ||
25 | - <template slot="title">Submenu</template> | ||
26 | - <MenuItem name="3-1">Option 7</MenuItem> | ||
27 | - <MenuItem name="3-2">Option 8</MenuItem> | 2 | + <div> |
3 | + <Menu ref="menu" active-name="1-2" :open-names="openNames" theme="dark" accordion @on-open-change="handleOpenChange"> | ||
4 | + <Submenu name="1"> | ||
5 | + <template slot="title"> | ||
6 | + <Icon type="ios-analytics"></Icon> | ||
7 | + Navigation One | ||
8 | + </template> | ||
9 | + <MenuGroup title="Item 1"> | ||
10 | + <MenuItem name="1-1">Option 1</MenuItem> | ||
11 | + <MenuItem name="1-2">Option 2</MenuItem> | ||
12 | + </MenuGroup> | ||
13 | + <MenuGroup title="Item 2"> | ||
14 | + <MenuItem name="1-3">Option 3</MenuItem> | ||
15 | + <MenuItem name="1-4">Option 4</MenuItem> | ||
16 | + </MenuGroup> | ||
28 | </Submenu> | 17 | </Submenu> |
29 | - </Submenu> | ||
30 | - <Submenu name="4"> | ||
31 | - <template slot="title"> | ||
32 | - <Icon type="ios-gear"></Icon> | ||
33 | - Navigation Three | ||
34 | - </template> | ||
35 | - <MenuItem name="4-1">Option 9</MenuItem> | ||
36 | - <MenuItem name="4-2">Option 10</MenuItem> | ||
37 | - <MenuItem name="4-3">Option 11</MenuItem> | ||
38 | - <MenuItem name="4-4">Option 12</MenuItem> | ||
39 | - </Submenu> | ||
40 | - </Menu> | 18 | + <Submenu name="2"> |
19 | + <template slot="title"> | ||
20 | + <Icon type="ios-filing"></Icon> | ||
21 | + Navigation Two | ||
22 | + </template> | ||
23 | + <MenuItem name="2-1">Option 5</MenuItem> | ||
24 | + <MenuItem name="2-2">Option 6</MenuItem> | ||
25 | + <Submenu name="3"> | ||
26 | + <template slot="title">Submenu</template> | ||
27 | + <MenuItem name="3-1">Option 7</MenuItem> | ||
28 | + <MenuItem name="3-2">Option 8</MenuItem> | ||
29 | + </Submenu> | ||
30 | + <Submenu name="4"> | ||
31 | + <template slot="title">Submenu</template> | ||
32 | + <MenuItem name="4-1">Option 7</MenuItem> | ||
33 | + <MenuItem name="4-2">Option 8</MenuItem> | ||
34 | + </Submenu> | ||
35 | + </Submenu> | ||
36 | + <Submenu name="5"> | ||
37 | + <template slot="title"> | ||
38 | + <Icon type="ios-gear"></Icon> | ||
39 | + Navigation Three | ||
40 | + </template> | ||
41 | + <MenuItem name="5-1">Option 9</MenuItem> | ||
42 | + <MenuItem name="5-2">Option 10</MenuItem> | ||
43 | + <MenuItem name="5-3">Option 11</MenuItem> | ||
44 | + <MenuItem name="5-4">Option 12</MenuItem> | ||
45 | + </Submenu> | ||
46 | + </Menu> | ||
47 | + <Button @click="setOpenNames">ไฟฎๆนๅฑๅผๆฐ็ป</Button> | ||
48 | + </div> | ||
41 | </template> | 49 | </template> |
42 | <script> | 50 | <script> |
43 | export default { | 51 | export default { |
44 | - | 52 | + data () { |
53 | + return { | ||
54 | + openNames: ['1'] | ||
55 | + }; | ||
56 | + }, | ||
57 | + methods: { | ||
58 | + handleOpenChange (name) { | ||
59 | + console.log(name) | ||
60 | + }, | ||
61 | + setOpenNames () { | ||
62 | + this.openNames = ['2', '3']; | ||
63 | + this.$nextTick(() => { | ||
64 | + this.$refs.menu.updateOpened(); | ||
65 | + }) | ||
66 | + } | ||
67 | + } | ||
45 | } | 68 | } |
46 | </script> | 69 | </script> |
src/components/menu/menu.vue
@@ -43,7 +43,8 @@ | @@ -43,7 +43,8 @@ | ||
43 | }, | 43 | }, |
44 | data () { | 44 | data () { |
45 | return { | 45 | return { |
46 | - currentActiveName: this.activeName | 46 | + currentActiveName: this.activeName, |
47 | + openedNames: [] | ||
47 | }; | 48 | }; |
48 | }, | 49 | }, |
49 | computed: { | 50 | computed: { |
@@ -76,36 +77,40 @@ | @@ -76,36 +77,40 @@ | ||
76 | this.broadcast('MenuItem', 'on-update-active-name', this.currentActiveName); | 77 | this.broadcast('MenuItem', 'on-update-active-name', this.currentActiveName); |
77 | }, | 78 | }, |
78 | updateOpenKeys (name) { | 79 | updateOpenKeys (name) { |
79 | - const index = this.openNames.indexOf(name); | ||
80 | - if (index > -1) { | ||
81 | - this.openNames.splice(index, 1); | 80 | + let names = [...this.openedNames]; |
81 | + const index = names.indexOf(name); | ||
82 | + if (index >= 0) { | ||
83 | + names.splice(index, 1); | ||
82 | } else { | 84 | } else { |
83 | - this.openNames.push(name); | ||
84 | if (this.accordion) { | 85 | if (this.accordion) { |
85 | - let currentSubmenu = {}; | 86 | + let currentSubmenu = null; |
86 | findComponentsDownward(this, 'Submenu').forEach(item => { | 87 | findComponentsDownward(this, 'Submenu').forEach(item => { |
87 | if (item.name === name) currentSubmenu = item; | 88 | if (item.name === name) currentSubmenu = item; |
88 | }); | 89 | }); |
89 | findBrothersComponents(currentSubmenu, 'Submenu').forEach(item => { | 90 | findBrothersComponents(currentSubmenu, 'Submenu').forEach(item => { |
90 | - let index = this.openNames.indexOf(item.name); | ||
91 | - this.openNames.splice(index, index >= 0 ? 1 : 0); | 91 | + let i = names.indexOf(item.name); |
92 | + if (i >= 0) names.splice(i, 1); | ||
92 | }); | 93 | }); |
93 | - this.openNames.push(name); | 94 | + names.push(name); |
94 | } | 95 | } |
95 | } | 96 | } |
97 | + this.openedNames = names; | ||
98 | + this.$emit('on-open-change', this.openedNames); | ||
96 | }, | 99 | }, |
97 | updateOpened () { | 100 | updateOpened () { |
98 | const items = findComponentsDownward(this, 'Submenu'); | 101 | const items = findComponentsDownward(this, 'Submenu'); |
99 | 102 | ||
100 | if (items.length) { | 103 | if (items.length) { |
101 | items.forEach(item => { | 104 | items.forEach(item => { |
102 | - if (this.openNames.indexOf(item.name) > -1) item.opened = true; | 105 | + if (this.openedNames.indexOf(item.name) > -1) item.opened = true; |
106 | + else item.opened = false; | ||
103 | }); | 107 | }); |
104 | } | 108 | } |
105 | } | 109 | } |
106 | }, | 110 | }, |
107 | mounted () { | 111 | mounted () { |
108 | this.updateActiveName(); | 112 | this.updateActiveName(); |
113 | + this.openedNames = [...this.openNames]; | ||
109 | this.updateOpened(); | 114 | this.updateOpened(); |
110 | this.$on('on-menu-item-select', (name) => { | 115 | this.$on('on-menu-item-select', (name) => { |
111 | this.currentActiveName = name; | 116 | this.currentActiveName = name; |
@@ -113,8 +118,8 @@ | @@ -113,8 +118,8 @@ | ||
113 | }); | 118 | }); |
114 | }, | 119 | }, |
115 | watch: { | 120 | watch: { |
116 | - openNames () { | ||
117 | - this.$emit('on-open-change', this.openNames); | 121 | + openNames (names) { |
122 | + this.openedNames = names; | ||
118 | }, | 123 | }, |
119 | activeName (val) { | 124 | activeName (val) { |
120 | this.currentActiveName = val; | 125 | this.currentActiveName = val; |