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