You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
2.7 KiB
127 lines
2.7 KiB
<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>
|
|
|