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