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