Skip to content

Picker 选择器

提供从一组预设数据中选择一项的能力,支持单列和多列选择。

基础用法

通过 columns 属性配置选项数据。

vue
<template>
  <button @click="show = true">打开选择器</button>
  <text>选中: {{ value }}</text>

  <dr-picker
    v-model:show="show"
    :columns="columns"
    title="选择城市"
    @confirm="onConfirm"
  />
</template>

<script setup>
import { ref } from 'vue'

const show = ref(false)
const value = ref('')
const columns = ['北京', '上海', '广州', '深圳', '杭州']

const onConfirm = (e) => {
  value.value = e.value[0]?.label
}
</script>

对象数组

columns 支持对象数组格式,通过 labelvalue 区分显示文本和值。

vue
<script setup>
const columns = [
  { label: '苹果', value: 'apple' },
  { label: '香蕉', value: 'banana' },
  { label: '橙子', value: 'orange' }
]

const onConfirm = (e) => {
  console.log('label:', e.value[0]?.label)
  console.log('value:', e.value[0]?.value)
}
</script>

多列选择

columns 传入二维数组可以实现多列选择。

vue
<template>
  <dr-picker
    v-model:show="show"
    :columns="columns"
    title="选择时间"
    @confirm="onConfirm"
  />
</template>

<script setup>
const columns = [
  ['上午', '下午'],
  ['1点', '2点', '3点', '4点', '5点', '6点']
]

const onConfirm = (e) => {
  const time = e.value.map(v => v.label).join(' ')
  console.log(time) // 上午 3点
}
</script>

默认选中

通过 default-index 属性设置默认选中项的索引。

vue
<dr-picker
  v-model:show="show"
  :columns="columns"
  :default-index="[2]"
  title="选择城市"
/>

自定义按钮文字

通过 confirm-textcancel-text 自定义按钮文字。

vue
<dr-picker
  v-model:show="show"
  :columns="columns"
  confirm-text="完成"
  cancel-text="返回"
/>

级联选择

通过监听 column-change 事件,实现多列数据的联动。

vue
<template>
  <dr-picker
    v-model:show="show"
    :columns="columns"
    title="选择地区"
    @column-change="onColumnChange"
    @confirm="onConfirm"
  />
</template>

<script setup>
import { ref } from 'vue'

const show = ref(false)

// 省市数据
const cityData = {
  '浙江': ['杭州', '宁波', '温州'],
  '江苏': ['南京', '苏州', '无锡'],
  '广东': ['广州', '深圳', '东莞']
}

// 初始列数据
const columns = ref([
  Object.keys(cityData),
  cityData['浙江']
])

// 列变化回调
const onColumnChange = ({ pickerView, value, columnIndex, resolve }) => {
  if (columnIndex === 0) {
    // 第一列变化时,更新第二列数据
    const cities = cityData[value.value] || []
    pickerView.setColumnValues(1, cities)
    pickerView.setColumnIndex(1, 0)
    resolve()
  }
}

const onConfirm = (e) => {
  console.log('选中:', e.value.map(v => v.label).join(' '))
}
</script>

column-change 回调参数

字段说明类型
pickerView操作 picker 的方法集合object
value当前变化列的选中值{ label, value }
columnIndex变化的列索引number
resolve更新列数据后调用的回调函数function

pickerView 方法

方法名说明参数
setColumnValues设置某列的数据(columnIndex, values)
getColumnValues获取某列的数据(columnIndex)
setColumnIndex设置某列的选中索引(columnIndex, valueIndex)
getColumnIndex获取某列的选中索引(columnIndex)
getIndexes获取所有列的选中索引-
getValues获取所有列的选中值-

API

Props

参数说明类型默认值
v-model:show是否显示选择器booleanfalse
columns选项数据,支持一维数组(单列)或二维数组(多列)array[]
default-index默认选中项索引array[]
title标题string''
show-toolbar是否显示工具栏booleantrue
confirm-text确认按钮文字string确定
cancel-text取消按钮文字string取消
mask-closable点击遮罩是否关闭booleantrue
z-index层级number5000
safe-area-bottom是否适配底部安全区booleantrue

Events

事件名说明回调参数
confirm点击确认按钮时触发{ index: number[], value: object[] }
cancel点击取消按钮时触发-
change选项变化时触发{ index: number[], value: object[] }
column-change某一列选项变化时触发,用于级联选择{ pickerView, value, columnIndex, resolve }
close关闭时触发-

回调参数说明

confirmchange 事件的回调参数:

字段说明类型
index选中项的索引数组number[]
value选中项的数据数组,包含 labelvalueobject[]

Methods

通过 ref 可以获取组件实例并调用以下方法:

方法名说明参数
setIndex设置选中项索引indexes: number[]
getValue获取当前选中值-
setColumnValues设置某列的数据(columnIndex, values)
getColumnValues获取某列的数据(columnIndex)
setColumnIndex设置某列的选中索引(columnIndex, valueIndex)
getColumnIndex获取某列的选中索引(columnIndex)
getIndexes获取所有列的选中索引-
getValues获取所有列的选中值-

基于 MIT 许可发布