下拉选择框,经过v-model绑定下拉数组选中值。支持自定义下拉内容,输出指定内容。javascript
源码:https://github.com/yapeee/uni...css
<template> <view> <ms-dropdown-menu> <ms-dropdown-item v-model="value1" :list="list"></ms-dropdown-item> <ms-dropdown-item v-model="value2" :list="list"></ms-dropdown-item> <ms-dropdown-item v-model="value3" :hasSlot="true" title="自定义下拉框内容" ref="dropdownItem"> <view class="dropdown-item-content"> <view>=====此为测试内容=====</view> <view class="btn" @click="choose">输出:test</view> <view class="btn" @click="close">关闭</view> </view> </ms-dropdown-item> </ms-dropdown-menu> <view>输出:{{value1}}</view> <view>输出:{{value2}}</view> <view>输出:{{value3}}</view> </view> </template> <script> import msDropdownMenu from '@/components/dropdown-select/dropdown-menu.vue' import msDropdownItem from '@/components/dropdown-select/dropdown-item.vue' export default { components: { msDropdownMenu, msDropdownItem }, props: { }, data() { return { list: [ { text: 'item1', value: 0 }, { text: 'item2', value: 1 }, { text: 'item3', value: 2 } ], value1: 0, value2: 1, value3: { name: 'init' } } }, watch: { }, mounted() { }, methods: { choose() { let obj = { value: { test: 1, name: 'test' } } this.$refs.dropdownItem.choose(obj) }, close() { this.$refs.dropdownItem.closePopup() } } } </script>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中项对应的 value,能够经过v-model双向绑定 | number、String、Object | - |
list | 选项数组 | Option[] | [] |
title | 自定义标题 | String | $uni-color-primary |
键名 | 说明 | 类型 |
---|---|---|
text | 文字 | string |
value | 标识符 | string、number、Object |
经过 ref 获取DropdownItem组件调用方法vue
方法称名 | 说明 |
---|---|
choose | 输出value |
closePopup | 关闭下拉框 |
1.设置下拉框样式java
/* 收起样式 */ transform: translateY(-100%); transition: all .3s; /* 展开样式 */ transform: translateY(0); transition: all .3s;
2.设置下拉框展开收起的位置git
this.getElementData('.dropdown-item__selected', (data)=>{ this.contentTop = data[0].bottom })
该操做是为了设置下拉框的位置,使下拉框展开收起的动画效果在超出下拉框位置的时候就会隐藏。从而实现真正的从菜单按钮底部开始展开,收起结束的动画效果。github
该操做的实现主要是经过emit
和on
的通讯来实现的。步骤以下:
1.点击DropdownItem组件,在展开下拉框以前,经过this.$parent.$emit('close')
触发DropdownMenu组件的close事件;
2.DropdownMenu组件经过this.$on('close', this.closeDropdown)
监听自定义事件;
3.DropdownMenu组件接收通知后,遍历DropdownItem组件,执行DropdownItem组件的close()
方法数组
closeDropdown() { this.$children.forEach(item =>{ item.close(); }) }
可经过DropdownItem组件的slot插槽来实现自定义下拉框内容。经过ref定位DropdownItem组件,调用choose
方法(输出value)和closePopup
方法(收起下拉框)实现自定义下拉内容。数据结构