u-dropdown-item.vue 3.19 KB
<template>
  <view class="u-drawdown">
    <view
      class="u-dropdown__menu"
      :style="{
				height: $u.addUnit(height)
			}"
      ref="u-dropdown__menu"
    >
      <view
        class="u-dropdown__menu__item"
        v-for="(item, index) in menuList"
        :key="index"
        @tap.stop="clickHandler(item, index)"
      >
        <view class="u-dropdown__menu__item__content">
          <text
            class="u-dropdown__menu__item__content__text"
            :style="[index === current ? activeStyle : inactiveStyle]"
          >{{item.title}}</text>
          <view
            class="u-dropdown__menu__item__content__arrow"
            :class="[index === current && 'u-dropdown__menu__item__content__arrow--rotate']"
          >
            <u-icon
              :name="menuIcon"
              :size="$u.addUnit(menuIconSize)"
            ></u-icon>
          </view>
        </view>
      </view>
    </view>
    <view class="u-dropdown__content">
      <slot />
    </view>
  </view>
</template>

<script>
import props from './props.js';
/**
 * Dropdown
 * @description
 * @tutorial url
 * @property {String}
 * @event {Function}
 * @example
 */
export default {
  name: 'u-dropdown',
  mixins: [uni.$u.mixin, props],
  data() {
    return {
      // �˵�����
      menuList: [],
      current: 0
    }
  },
  computed: {
  
  },
  created() {
    // �������������(u-dropdown-item)��this��������data������������������΢��С��������ѭ�����ö�����
    this.children = [];
  },
  methods: {
    clickHandler(item, index) {
      this.children.map(child => {
        if(child.title === item.title) {
          // this.queryRect('u-dropdown__menu').then(size => {
          child.$emit('click')
          child.setContentAnimate(child.show ? 0 : 300)
          child.show = !child.show
          // })
        } else {
          child.show = false
          child.setContentAnimate(0)
        }
      })
    },
    // ��ȡ��ǩ�ijߴ�λ��
    queryRect(el) {
      // #ifndef APP-NVUE
      // $uGetRectΪuView�Դ��Ľڵ��ѯ�򻯷���������ĵ����ܣ�https://www.uviewui.com/js/getRect.html
      // ����ڲ�һ����this.$uGetRect�������Ϊthis.$u.getRect�����߹���һ�£����Ʋ�ͬ
      return new Promise(resolve => {
        this.$uGetRect(`.${el}`).then(size => {
          resolve(size)
        })
      })
      // #endif
      
      // #ifdef APP-NVUE
      // nvue�£�ʹ��domģ���ѯԪ�ظ߶�
      // ����һ��promise���õ��ô˷�����������ʹ��then�ص�
      return new Promise(resolve => {
        dom.getComponentRect(this.$refs[el], res => {
          resolve(res.size)
        })
      })
      // #endif
    },
  },
}
</script>

<style lang="scss">
@import '../../libs/css/components.scss';

.u-dropdown {
  
  &__menu {
    @include flex;
    
    &__item {
      flex: 1;
      @include flex;
      justify-content: center;
      
      &__content {
        @include flex;
        align-items: center;
      }
    }
  }
}
</style>