123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import { VantComponent } from '../common/component';
- import { addUnit } from '../common/utils';
- let ARRAY = [];
- VantComponent({
- field: true,
- relation: {
- name: 'dropdown-item',
- type: 'descendant',
- linked(target) {
- this.children.push(target);
- this.updateItemListData();
- },
- unlinked(target) {
- this.children = this.children.filter((child) => child !== target);
- 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 } = wx.getSystemInfoSync();
- this.windowHeight = windowHeight;
- this.children = [];
- 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 this.getRect('.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);
- }
- }
- }
- });
|