change the way to handle submenu collapse when accordion is true
This commit is contained in:
parent
b924d14da3
commit
2b24fcceed
7 changed files with 147 additions and 12 deletions
32
examples/routers/menu-item.vue
Normal file
32
examples/routers/menu-item.vue
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<template>
|
||||||
|
<Submenu :name="`${parentName}`">
|
||||||
|
<template slot="title">
|
||||||
|
<span>{{ parentItem.name }}</span>
|
||||||
|
</template>
|
||||||
|
<template v-for="item in children">
|
||||||
|
<custem-menu-item v-if="item.children && item.children.length !== 0" :key="`menu-${item.name}`" :parent-item="item"></custem-menu-item>
|
||||||
|
<menu-item v-else :name="`${item.name}`" :key="`menu-${item.name}`">{{ item.name }}</menu-item>
|
||||||
|
</template>
|
||||||
|
</Submenu>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'custemMenuItem',
|
||||||
|
props: {
|
||||||
|
parentItem: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
},
|
||||||
|
theme: String,
|
||||||
|
iconSize: Number
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
parentName () {
|
||||||
|
return this.parentItem.name
|
||||||
|
},
|
||||||
|
children () {
|
||||||
|
return this.parentItem.children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -44,14 +44,92 @@
|
||||||
<MenuItem name="5-4">Option 12</MenuItem>
|
<MenuItem name="5-4">Option 12</MenuItem>
|
||||||
</Submenu>
|
</Submenu>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
<!-- <Menu theme="dark" accordion @on-open-change="handleOpenChange">
|
||||||
|
<template v-for="item in menuList">
|
||||||
|
<custem-menu-item v-if="item.children" :key="`menu-${item.name}`" :parent-item="item"></custem-menu-item>
|
||||||
|
<menu-item v-else :name="`${item.name}`" :key="`menu-${item.name}`">{{ item.name }}</menu-item>
|
||||||
|
</template>
|
||||||
|
</Menu>
|
||||||
<Button @click="setOpenNames">修改展开数组</Button>
|
<Button @click="setOpenNames">修改展开数组</Button>
|
||||||
|
<Button @click="addNewItem">添加菜单项</Button> -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
import custemMenuItem from './menu-item.vue'
|
||||||
export default {
|
export default {
|
||||||
|
components: {
|
||||||
|
custemMenuItem
|
||||||
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
openNames: ['1']
|
openNames: ['1'],
|
||||||
|
menuList: [
|
||||||
|
{
|
||||||
|
name: '111',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '111-111'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '111-222'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-111'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-222',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-222-111'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-222-222',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-222-222-111'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-222-222-222'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-333',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-333-111',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-333-111-111'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-333-111-222'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-333-222',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-333-222-111'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '222-333-222-222'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -63,6 +141,16 @@
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.menu.updateOpened();
|
this.$refs.menu.updateOpened();
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
addNewItem () {
|
||||||
|
this.menuList[1].children[1].children.push({
|
||||||
|
name: '222-222-333',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: '222-222-333-111'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
8
package-lock.json
generated
8
package-lock.json
generated
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "iview",
|
"name": "iview",
|
||||||
"version": "2.13.1",
|
"version": "2.14.0-rc.1",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sinonjs/formatio": {
|
"@sinonjs/formatio": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
|
||||||
"integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
|
"integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
@ -2315,7 +2315,7 @@
|
||||||
},
|
},
|
||||||
"compression": {
|
"compression": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.2",
|
||||||
"resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
|
||||||
"integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
|
"integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
@ -9278,7 +9278,7 @@
|
||||||
},
|
},
|
||||||
"onetime": {
|
"onetime": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
|
||||||
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
|
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
"src"
|
"src"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "webpack-dev-server --content-base test/ --open --inline --hot --compress --history-api-fallback --port 8081 --config build/webpack.dev.config.js",
|
"dev": "webpack-dev-server --content-base test/ --open --inline --hot --compress --history-api-fallback --port 1234 --config build/webpack.dev.config.js",
|
||||||
"dev:s": "webpack-dev-server --content-base test/ --open --inline --hot --compress --history-api-fallback --port 8081 --host 0.0.0.0 --config build/webpack.dev.config.js",
|
"dev:s": "webpack-dev-server --content-base test/ --open --inline --hot --compress --history-api-fallback --port 8081 --host 0.0.0.0 --config build/webpack.dev.config.js",
|
||||||
"dist:style": "gulp --gulpfile build/build-style.js",
|
"dist:style": "gulp --gulpfile build/build-style.js",
|
||||||
"dist:dev": "webpack --config build/webpack.dist.dev.config.js",
|
"dist:dev": "webpack --config build/webpack.dist.dev.config.js",
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<ul :class="classes" :style="styles"><slot></slot></ul>
|
<ul :class="classes" :style="styles"><slot></slot></ul>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { oneOf, findComponentsDownward, findBrothersComponents } from '../../utils/assist';
|
import { oneOf, findComponentsDownward, findComponentsUpward } from '../../utils/assist';
|
||||||
import Emitter from '../../mixins/emitter';
|
import Emitter from '../../mixins/emitter';
|
||||||
|
|
||||||
const prefixCls = 'ivu-menu';
|
const prefixCls = 'ivu-menu';
|
||||||
|
@ -84,17 +84,18 @@
|
||||||
} else {
|
} else {
|
||||||
if (this.accordion) {
|
if (this.accordion) {
|
||||||
let currentSubmenu = null;
|
let currentSubmenu = null;
|
||||||
|
names = [];
|
||||||
findComponentsDownward(this, 'Submenu').forEach(item => {
|
findComponentsDownward(this, 'Submenu').forEach(item => {
|
||||||
if (item.name === name) currentSubmenu = item;
|
if (item.name === name) currentSubmenu = item;
|
||||||
});
|
});
|
||||||
findBrothersComponents(currentSubmenu, 'Submenu').forEach(item => {
|
findComponentsUpward(currentSubmenu, 'Submenu').forEach(item => {
|
||||||
let i = names.indexOf(item.name);
|
names.push(item.name);
|
||||||
if (i >= 0) names.splice(i, 1);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
names.push(name);
|
names.push(name);
|
||||||
}
|
}
|
||||||
this.openedNames = names;
|
this.openedNames = names;
|
||||||
|
this.updateOpened();
|
||||||
this.$emit('on-open-change', this.openedNames);
|
this.$emit('on-open-change', this.openedNames);
|
||||||
},
|
},
|
||||||
updateOpened () {
|
updateOpened () {
|
||||||
|
|
|
@ -16,4 +16,4 @@ export default {
|
||||||
return this.menu.mode;
|
return this.menu.mode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -234,7 +234,9 @@ export function findBrothersComponents (context, componentName, exceptMe = true)
|
||||||
let res = context.$parent.$children.filter(item => {
|
let res = context.$parent.$children.filter(item => {
|
||||||
return item.$options.name === componentName;
|
return item.$options.name === componentName;
|
||||||
});
|
});
|
||||||
let index = res.indexOf(context);
|
let index = res.findIndex(item => {
|
||||||
|
return item._uid === context._uid;
|
||||||
|
});
|
||||||
if (exceptMe) res.splice(index, 1);
|
if (exceptMe) res.splice(index, 1);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -322,3 +324,15 @@ export function setMatchMedia () {
|
||||||
window.matchMedia = window.matchMedia || matchMediaPolyfill;
|
window.matchMedia = window.matchMedia || matchMediaPolyfill;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getCommonString (arr1, arr2) {
|
||||||
|
const len1 = arr1.length;
|
||||||
|
const len2 = arr2.length;
|
||||||
|
let i = -1;
|
||||||
|
const len = Math.min(len1, len2);
|
||||||
|
let res = [];
|
||||||
|
while (++i < len) {
|
||||||
|
if (arr1.indexOf(arr2[i]) >= 0) res.push(arr2[i]);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue