123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <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)
- }
- })
- },
- // 获取标签的尺寸位置
- 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>
|