// Utils import { createNamespace, isDef } from '../utils'; import { getScroller } from '../utils/dom/scroll'; // Mixins import { ParentMixin } from '../mixins/relation'; import { ClickOutsideMixin } from '../mixins/click-outside'; const [createComponent, bem] = createNamespace('dropdown-menu'); export default createComponent({ mixins: [ ParentMixin('vanDropdownMenu'), ClickOutsideMixin({ event: 'click', method: 'onClickOutside', }), ], props: { zIndex: [Number, String], activeColor: String, overlay: { type: Boolean, default: true, }, duration: { type: [Number, String], default: 0.2, }, direction: { type: String, default: 'down', }, closeOnClickOverlay: { type: Boolean, default: true, }, }, data() { return { offset: 0, }; }, computed: { scroller() { return getScroller(this.$el); }, opened() { return this.children.some((item) => item.showWrapper); }, barStyle() { if (this.opened && isDef(this.zIndex)) { return { zIndex: 1 + this.zIndex, }; } }, }, methods: { updateOffset() { if (!this.$refs.bar) { return; } const rect = this.$refs.bar.getBoundingClientRect(); if (this.direction === 'down') { this.offset = rect.bottom; } else { this.offset = window.innerHeight - rect.top; } }, toggleItem(active) { this.children.forEach((item, index) => { if (index === active) { item.toggle(); } else if (item.showPopup) { item.toggle(false, { immediate: true }); } }); }, onClickOutside() { this.children.forEach((item) => { item.toggle(false); }); }, }, render() { const Titles = this.children.map((item, index) => (