New file |
| | |
| | | <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> |