mirror of https://github.com/ElemeFE/element
Menu: close menus on collapse change
parent
418aef63a4
commit
5137867044
|
@ -13,71 +13,9 @@
|
||||||
</el-menu-collapse-transition>
|
</el-menu-collapse-transition>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import Vue from 'vue';
|
|
||||||
import emitter from 'element-ui/src/mixins/emitter';
|
import emitter from 'element-ui/src/mixins/emitter';
|
||||||
import { addClass, removeClass, hasClass } from 'element-ui/src/utils/dom';
|
import { addClass, removeClass, hasClass } from 'element-ui/src/utils/dom';
|
||||||
|
|
||||||
Vue.component('el-menu-collapse-transition', {
|
|
||||||
functional: true,
|
|
||||||
render(createElement, context) {
|
|
||||||
const data = {
|
|
||||||
props: {
|
|
||||||
mode: 'out-in'
|
|
||||||
},
|
|
||||||
on: {
|
|
||||||
beforeEnter(el) {
|
|
||||||
el.style.opacity = 0.2;
|
|
||||||
},
|
|
||||||
|
|
||||||
enter(el) {
|
|
||||||
addClass(el, 'el-opacity-transition');
|
|
||||||
el.style.opacity = 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
afterEnter(el) {
|
|
||||||
removeClass(el, 'el-opacity-transition');
|
|
||||||
el.style.opacity = '';
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeLeave(el) {
|
|
||||||
if (!el.dataset) el.dataset = {};
|
|
||||||
|
|
||||||
if (hasClass(el, 'el-menu--collapse')) {
|
|
||||||
removeClass(el, 'el-menu--collapse');
|
|
||||||
el.dataset.oldOverflow = el.style.overflow;
|
|
||||||
el.dataset.scrollWidth = el.scrollWidth;
|
|
||||||
addClass(el, 'el-menu--collapse');
|
|
||||||
}
|
|
||||||
|
|
||||||
el.style.width = el.scrollWidth + 'px';
|
|
||||||
el.style.overflow = 'hidden';
|
|
||||||
},
|
|
||||||
|
|
||||||
leave(el) {
|
|
||||||
if (!hasClass(el, 'el-menu--collapse')) {
|
|
||||||
addClass(el, 'horizontal-collapse-transition');
|
|
||||||
el.style.width = '64px';
|
|
||||||
} else {
|
|
||||||
addClass(el, 'horizontal-collapse-transition');
|
|
||||||
el.style.width = el.dataset.scrollWidth + 'px';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
afterLeave(el) {
|
|
||||||
removeClass(el, 'horizontal-collapse-transition');
|
|
||||||
if (hasClass(el, 'el-menu--collapse')) {
|
|
||||||
el.style.width = el.dataset.scrollWidth + 'px';
|
|
||||||
} else {
|
|
||||||
el.style.width = '64px';
|
|
||||||
}
|
|
||||||
el.style.overflow = el.dataset.oldOverflow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return createElement('transition', data, context.children);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ElMenu',
|
name: 'ElMenu',
|
||||||
|
|
||||||
|
@ -91,6 +29,69 @@
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
components: {
|
||||||
|
'el-menu-collapse-transition': {
|
||||||
|
functional: true,
|
||||||
|
render(createElement, context) {
|
||||||
|
const data = {
|
||||||
|
props: {
|
||||||
|
mode: 'out-in'
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
beforeEnter(el) {
|
||||||
|
el.style.opacity = 0.2;
|
||||||
|
},
|
||||||
|
|
||||||
|
enter(el) {
|
||||||
|
addClass(el, 'el-opacity-transition');
|
||||||
|
el.style.opacity = 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
afterEnter(el) {
|
||||||
|
removeClass(el, 'el-opacity-transition');
|
||||||
|
el.style.opacity = '';
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeLeave(el) {
|
||||||
|
if (!el.dataset) el.dataset = {};
|
||||||
|
|
||||||
|
if (hasClass(el, 'el-menu--collapse')) {
|
||||||
|
removeClass(el, 'el-menu--collapse');
|
||||||
|
el.dataset.oldOverflow = el.style.overflow;
|
||||||
|
el.dataset.scrollWidth = el.scrollWidth;
|
||||||
|
addClass(el, 'el-menu--collapse');
|
||||||
|
}
|
||||||
|
|
||||||
|
el.style.width = el.scrollWidth + 'px';
|
||||||
|
el.style.overflow = 'hidden';
|
||||||
|
},
|
||||||
|
|
||||||
|
leave(el) {
|
||||||
|
if (!hasClass(el, 'el-menu--collapse')) {
|
||||||
|
addClass(el, 'horizontal-collapse-transition');
|
||||||
|
el.style.width = '64px';
|
||||||
|
} else {
|
||||||
|
addClass(el, 'horizontal-collapse-transition');
|
||||||
|
el.style.width = el.dataset.scrollWidth + 'px';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
afterLeave(el) {
|
||||||
|
removeClass(el, 'horizontal-collapse-transition');
|
||||||
|
if (hasClass(el, 'el-menu--collapse')) {
|
||||||
|
el.style.width = el.dataset.scrollWidth + 'px';
|
||||||
|
} else {
|
||||||
|
el.style.width = '64px';
|
||||||
|
}
|
||||||
|
el.style.overflow = el.dataset.oldOverflow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return createElement('transition', data, context.children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
mode: {
|
mode: {
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -134,6 +135,9 @@
|
||||||
},
|
},
|
||||||
defaultOpeneds(value) {
|
defaultOpeneds(value) {
|
||||||
this.openedMenus = value;
|
this.openedMenus = value;
|
||||||
|
},
|
||||||
|
collapse(value) {
|
||||||
|
if (value) this.openedMenus = [];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
Loading…
Reference in New Issue