从底部弹起的滚动选择器。
支持五种选择器,通过mode来区分,
分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,
默认是普通选择器。

普通选择器

mode = selector

属性说明

属性名 类型 默认值 说明 平台差异说明
range Array / Array<Object> [] mode为 selector 或 multiSelector 时,range 有效
range-key String 当 range 是一个 Array<Object> 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
value Number 0 value 的值表示选择了 range 中的第几个(下标从 0 开始)
selector-type String auto 大屏时UI类型,支持 picker、select、auto,默认在 iPad 以 picker 样式展示而在 PC 以 select 样式展示 H5 2.9.9+
@change EventHandle value 改变时触发 change 事件,event.detail = {value: value}
disabled Boolean false 是否禁用
@cancel EventHandle 取消选择或点遮罩层收起 picker 时触发
  • picker在各平台的实现是有UI差异的,有的平台如百度、支付宝小程序的Android端是从中间弹出的;有的平台支持循环滚动如百度小程序;有的平台没有取消按钮如App-iOS端。但均不影响功能使用。

    多列选择器

    mode = multiSelector
    平台差异说明
App H5 微信小程序 支付宝小程序 百度小程序 字节跳动小程序 QQ小程序
vue支持,nvue自2.4起支持 x

支付宝小程序 picker 组件不支持多列选择,可以使用 picker-view 组件替代。

属性说明

属性名 类型 默认值 说明
range 二维 Array / 二维 Array<Object> [] mode为 selector 或 multiSelector 时,range 有效。二维数组,长度表示多少列,数组的每项表示每列的数据,如[[“a”,”b”], [“c”,”d”]]
range-key String 当 range 是一个二维 Array<Object> 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
value Array [] value 每一项的值表示选择了 range 对应项中的第几个(下标从 0 开始)
@change EventHandle value 改变时触发 change 事件,event.detail = {value: value}
@columnchange EventHandle 某一列的值改变时触发 columnchange 事件,event.detail = {column: column, value: value},column 的值表示改变了第几列(下标从0开始),value 的值表示变更值的下标
@cancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用

bug & tips

  • 由于 JavaScript 的限制 vue 不能观测如下方式设置 value:this.value[0] = 0vue 注意事项),解决方式参考:hello-uniapp 示例
  • 微信开发工具的pc模拟器有可能出现拖动数据错乱,使用真机正常

    时间选择器

    mode = time

    平台差异说明

    | App | H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节跳动小程序 | QQ小程序 | | :—-: | :—-: | :—-: | :—-: | :—-: | :—-: | :—-: | | √ | √ | √ | √ | √ | √ | √ |

  • 时间选择在App端调用的是os的原生时间选择控件,在不同平台有不同的ui表现

    属性说明

    | 属性名 | 类型 | 默认值 | 说明 | 平台差异说明 | | :—- | :—- | :—- | :—- | :—- | | value | String | | 表示选中的时间,格式为”hh:mm” | | | start | String | | 表示有效时间范围的开始,字符串格式为”hh:mm” | App 不支持 | | end | String | | 表示有效时间范围的结束,字符串格式为”hh:mm” | App 不支持 | | @change | EventHandle | | value 改变时触发 change 事件,event.detail = {value: value} | | | @cancel | EventHandle | | 取消选择时触发 | | | disabled | Boolean | false | 是否禁用 | |

日期选择器

mode = date

平台差异说明

App H5 微信小程序 支付宝小程序 百度小程序 字节跳动小程序 QQ小程序

日期选择默认在App端和H5端(PC版Chrome以及PC版FireFox)调用的是os的原生日期选择控件,在不同平台有不同的ui表现,当配置fields参数后使用统一的展示方式。

属性说明

属性名 类型 默认值 说明 平台差异说明
value String 0 表示选中的日期,格式为”YYYY-MM-DD”
start String 表示有效日期范围的开始,字符串格式为”YYYY-MM-DD”
end String 表示有效日期范围的结束,字符串格式为”YYYY-MM-DD”
fields String day 有效值 year、month、day,表示选择器的粒度,默认为 day,App 端未配置此项时使用系统 UI H5、App 2.6.3+、微信小程序、百度小程序、字节跳动小程序
@change EventHandle value 改变时触发 change 事件,event.detail = {value: value}
@cancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用

fields 有效值

说明
year 选择器粒度为年
month 选择器粒度为月份
day 选择器粒度为天

省市区选择器

mode = region

平台差异说明

App H5 微信小程序 支付宝小程序 百度小程序 字节跳动小程序 QQ小程序
x x x
  • 因省市区选择器包含大量数据,占用体积,并非所有应用都需要,且很多城市数据有自维护需求,

所以在App和H5平台没有内置。
可以基于多列picker或picker-view,自行填充城市数据,插件市场有较多类似插件,详见
注意基于多列picker方式的地区选择不能运行在支付宝小程序上,只有基于picker-view的可以全端运行。、 这些插件中,比较推荐的是SimpleJalon的地址联动选择插件
它可以同时兼容app-nvue、app-vue、h5、及各端小程序。

属性名 类型 默认值 说明
value Array [] 表示选中的省市区,默认选中每一列的第一个值
custom-item String 可为每一列的顶部添加一个自定义的项
@change EventHandle value 改变时触发 change 事件,event.detail = {value: value}
@cancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用

示例

查看演示
以下示例代码,来自于hello uni-app项目,推荐使用HBuilderX,新建uni-app项目,选择hello uni-app模板,可直接体验完整示例。

  1. <!-- 本示例未包含完整css,获取外链css请参考上文,在hello uni-app项目中查看 -->
  2. <template>
  3. <view>
  4. <view class="uni-title uni-common-pl">地区选择器</view>
  5. <view class="uni-list">
  6. <view class="uni-list-cell">
  7. <view class="uni-list-cell-left">
  8. 当前选择
  9. </view>
  10. <view class="uni-list-cell-db">
  11. <picker @change="bindPickerChange" :value="index" :range="array">
  12. <view class="uni-input">{{array[index]}}</view>
  13. </picker>
  14. </view>
  15. </view>
  16. </view>
  17. <view class="uni-title uni-common-pl">时间选择器</view>
  18. <view class="uni-list">
  19. <view class="uni-list-cell">
  20. <view class="uni-list-cell-left">
  21. 当前选择
  22. </view>
  23. <view class="uni-list-cell-db">
  24. <picker mode="time" :value="time" start="09:01" end="21:01" @change="bindTimeChange">
  25. <view class="uni-input">{{time}}</view>
  26. </picker>
  27. </view>
  28. </view>
  29. </view>
  30. <view class="uni-title uni-common-pl">日期选择器</view>
  31. <view class="uni-list">
  32. <view class="uni-list-cell">
  33. <view class="uni-list-cell-left">
  34. 当前选择
  35. </view>
  36. <view class="uni-list-cell-db">
  37. <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
  38. <view class="uni-input">{{date}}</view>
  39. </picker>
  40. </view>
  41. </view>
  42. </view>
  43. </view>
  44. </template>
  1. export default {
  2. data() {
  3. const currentDate = this.getDate({
  4. format: true
  5. })
  6. return {
  7. title: 'picker',
  8. array: ['中国', '美国', '巴西', '日本'],
  9. index: 0,
  10. date: currentDate,
  11. time: '12:01'
  12. }
  13. },
  14. computed: {
  15. startDate() {
  16. return this.getDate('start');
  17. },
  18. endDate() {
  19. return this.getDate('end');
  20. }
  21. },
  22. methods: {
  23. bindPickerChange: function(e) {
  24. console.log('picker发送选择改变,携带值为', e.target.value)
  25. this.index = e.target.value
  26. },
  27. bindDateChange: function(e) {
  28. this.date = e.target.value
  29. },
  30. bindTimeChange: function(e) {
  31. this.time = e.target.value
  32. },
  33. getDate(type) {
  34. const date = new Date();
  35. let year = date.getFullYear();
  36. let month = date.getMonth() + 1;
  37. let day = date.getDate();
  38. if (type === 'start') {
  39. year = year - 60;
  40. } else if (type === 'end') {
  41. year = year + 2;
  42. }
  43. month = month > 9 ? month : '0' + month;;
  44. day = day > 9 ? day : '0' + day;
  45. return `${year}-${month}-${day}`;
  46. }
  47. }
  48. }

picker - 图1
示例代码说明:以上示例代码从hello uni-app示例中复制,涉及的css样式在hello uni-app的app.vue和uni.css中
预览H5效果:使用浏览器的手机模式访问https://hellouniapp.dcloud.net.cn/pages/component/picker/picker

注意

  • 在picker内容还在滚动时或滚动回弹动画还未结束时,点确定关闭弹出的picker,数据无法及时更新。需等待一下,或手动触停滚动再点确定。所有平台均如此
  • 如果需要在PC端使用picker,需注意pc端没有touchmove事件,可以配置H5模版,并引入touch-emulator.js来解决。hello uni-app的pc版也是使用了这个方案。