123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import { VantComponent } from '../common/component';
- import { useChildren } from '../common/relation';
- import { addUnit, getRect, getSystemInfoSync } from '../common/utils';
- let ARRAY = [];
- VantComponent({
- field: true,
- relation: useChildren('dropdown-item', function () {
- this.updateItemListData();
- }),
- props: {
- activeColor: {
- type: String,
- observer: 'updateChildrenData',
- },
- overlay: {
- type: Boolean,
- value: true,
- observer: 'updateChildrenData',
- },
- zIndex: {
- type: Number,
- value: 10,
- },
- duration: {
- type: Number,
- value: 200,
- observer: 'updateChildrenData',
- },
- direction: {
- type: String,
- value: 'down',
- observer: 'updateChildrenData',
- },
- closeOnClickOverlay: {
- type: Boolean,
- value: true,
- observer: 'updateChildrenData',
- },
- closeOnClickOutside: {
- type: Boolean,
- value: true,
- },
- },
- data: {
- itemListData: [],
- },
- beforeCreate() {
- const { windowHeight } = getSystemInfoSync();
- this.windowHeight = windowHeight;
- ARRAY.push(this);
- },
- destroyed() {
- ARRAY = ARRAY.filter((item) => item !== this);
- },
- methods: {
- updateItemListData() {
- this.setData({
- itemListData: this.children.map((child) => child.data),
- });
- },
- updateChildrenData() {
- this.children.forEach((child) => {
- child.updateDataFromParent();
- });
- },
- toggleItem(active) {
- this.children.forEach((item, index) => {
- const { showPopup } = item.data;
- if (index === active) {
- item.toggle();
- }
- else if (showPopup) {
- item.toggle(false, { immediate: true });
- }
- });
- },
- close() {
- this.children.forEach((child) => {
- child.toggle(false, { immediate: true });
- });
- },
- getChildWrapperStyle() {
- const { zIndex, direction } = this.data;
- return getRect(this, '.van-dropdown-menu').then((rect) => {
- const { top = 0, bottom = 0 } = rect;
- const offset = direction === 'down' ? bottom : this.windowHeight - top;
- let wrapperStyle = `z-index: ${zIndex};`;
- if (direction === 'down') {
- wrapperStyle += `top: ${addUnit(offset)};`;
- }
- else {
- wrapperStyle += `bottom: ${addUnit(offset)};`;
- }
- return wrapperStyle;
- });
- },
- onTitleTap(event) {
- const { index } = event.currentTarget.dataset;
- const child = this.children[index];
- if (!child.data.disabled) {
- ARRAY.forEach((menuItem) => {
- if (menuItem &&
- menuItem.data.closeOnClickOutside &&
- menuItem !== this) {
- menuItem.close();
- }
- });
- this.toggleItem(index);
- }
- },
- },
- });
|