暗黑模式
Picker 选择器
预览
01:38
组件名:rice-image
此选择器用于单列,多列,多列联动的选择场景
平台兼容性
uni-app x
Android | iOS | 鸿蒙Next | 微信小程序 | h5 |
---|---|---|---|---|
√ | √ | √ | √ | √ |
单列选择
Picker
组件通过 columns
属性配置选项数据,columns
是一个二维数组,类型为 PickerOption[][]
单列选择的 columns
格式为 [[]]
html
<rice-picker v-model:show="showColumns" :columns="columns" @confirm="onColumnsConfirm"></rice-picker>
<script setup lang="ts">
import { PickerOption, PickerEvent } from "@/uni_modules/rice-ui/index"
const showColumns = ref(false)
const columns = ref<PickerOption[][]>([
[
{ text: '杭州', value: 'Hangzhou' },
{ text: '宁波', value: 'Ningbo' },
{ text: '温州', value: 'Wenzhou', },
{ text: '绍兴', value: 'Shaoxing' },
{ text: '湖州', value: 'Huzhou' },
{ text: '金华', value: 'JinHua' },
{ text: '嘉兴', value: 'JiaXing' },
]
])
const onColumnsConfirm = (e:PickerEvent) => {
console.log('PickerEvent', e)
columnsValue.value = e.selectedValues as string[]
}
</script>
多列选择
多列选择的 columns
格式为 [[],[]]
html
<rice-picker v-model:show="showMultiple" :columns="multiple"></rice-picker>
<script setup>
const showMultiple=ref(false)
const multiple = ref<PickerOption[][]>(
[
// 第一列
[
{ text: '周一', value: 'Monday' },
{ text: '周二', value: 'Tuesday' },
{ text: '周三', value: 'Wednesday' },
{ text: '周四', value: 'Thursday', },
{ text: '周五', value: 'Friday' },
],
// 第二列
[
{ text: '上午', value: 'Morning' },
{ text: '下午', value: 'Afternoon' },
{ text: '晚上', value: 'Evening' },
],
]);
</script>
级联选择
级联选择的 columns
格式为[[{value:x,children:{}}]]
html
<rice-picker v-model:show="showCascade" :columns="cascade"></rice-picker>
<script setup>
const showCascade=ref(false)
const cascade = ref<PickerOption[][]>([
[
{
text: '浙江',
value: 'Zhejiang',
children: [
{
text: '杭州',
value: 'Hangzhou',
children: [
{ text: '西湖区', value: 'Xihu' },
{ text: '余杭区', value: 'Yuhang' },
{ text: '滨江', value: 'BinJiang' },
],
},
{
text: '温州',
value: 'Wenzhou',
children: [
{ text: '鹿城区', value: 'Lucheng' },
{ text: '瓯海区', value: 'Ouhai' },
],
},
],
},
{
text: '福建',
value: 'Fujian',
children: [
{
text: '福州',
value: 'Fuzhou',
children: [
{ text: '鼓楼区', value: 'Gulou', },
{ text: '台江区', value: 'Taijiang' },
],
},
{
text: '厦门',
value: 'Xiamen',
children: [
{ text: '思明区', value: 'Siming' },
{ text: '海沧区', value: 'Haicang' },
],
},
],
},
]
])
</script>
省市区选择
很多时候开发者拿到的数据格式不一定是PickerOption
类型,那么就要手动转为 PickerOption
类型了,因为uniappx
是有严格的类型校验的。
html
<rice-picker v-model:show="showArea" :columns="areaList"/>
<script setup>
const showArea = ref(false)
const areaList = ref<PickerOption[][]>([])
let transformAreaData : ((list : AreaData[]) => PickerOption[]) | null = null
transformAreaData = (list : AreaData[]) => {
const result = list.map(item => {
const children = item['children'] as AreaData[] | null
return {
value: item.code,
text: item.name,
extend: { code: item.code },
children: (children != null && children.length > 0) ? transformAreaData!(children) : null
} as PickerOption
})
return result
}
// 假设area为后端返回的数据
areaList.value = [transformAreaData!(area!)] as PickerOption[][]
</script>
顶部标题栏
设置 toolbar-position
为 top
即可设置顶部标题栏
html
<rice-picker v-model:show="showTopColumns" :columns="columns" title="顶部标题栏" toolbar-position="top"
confirm-button-text="完成" cancel-button-text="关闭" />
双向绑定
Picker
组件支持 v-model
双向绑定
html
<rice-picker v-model:show="showColumns2" v-model="columnsValues2" :columns="columns" toolbar-position="top"
:title="`双向绑定值:${columnsValues2.join('')}`" cancel-button-text="" confirm-button-text="" />
<script setup>
const showColumns2 = ref(false)
const columnsValues2=ref<string>(['Wenzhou'])
</script>
不使用 Popup
设置use-popup
为 false
即可不使用 popup
html
<rice-picker :use-popup="false" :model-value="columnsValues2" :columns="columns" toolbar-position="none" />
API
Props
属性名 | 类型 | 说明 | 默认值 |
---|---|---|---|
model-value | Array | 绑定的数据 | - |
columns | Array | 数据,二维数组格式 ,默认[[]] ,单列:[[]] 多列:[[],[]],联动:[[{value:x,children:{}}]] | - |
toolbar-position | String | 顶部栏位置,可选值:top、bottom、none | bottom |
title | String | 顶部栏标题 | - |
confirm-button-text | String | 确定按钮文字,设置为空字符串可以隐藏 | 确定 |
cancel-button-text | String | 取消按钮文字,设置为空字符串可以隐藏 | 取消 |
font-size | String|Number | 选项的文字大小 | 16px |
option-height | String|Number | 每个选项的高度 | 50px |
visible-option-num | Number | 可见的选项个数 | 5 |
close-on-click-overlay | Boolean | 是否在点击遮罩层后关闭 | true |
close-on-click-confirm | Boolean | 是否在点击确认按钮后关闭 | true |
close-on-click-cancel | Boolean | 是否在点击取消按钮后关闭 | true |
loading | Boolean | 是否为加载状态 | - |
safe-area-inset-bottom | Boolean | 是否开启底部安全区适配 | - |
use-popup | Boolean | 是否使用popup 默认 true | - |
immediate-change | Boolean | 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件。默认true,仅微信小程序支持 | - |
z-index | Boolean | z-index 层级 | 10099 |
empty-text | String | 空数据时的提示语 默认 暂无数据 | - |
Event
事件名 | 说明 | 回调参数 |
---|---|---|
confirm | 点击确认按钮时触发 | (event: PickerEvent) |
cancel | 点击取消按钮时触发 | (event: PickerEvent) |
change | 选项改变时触发 | (event: PickerEvent) |
类型定义
类型
ts
type PickerOption = {
text : string | number,
value : string | number,
disabled ?: boolean,
children ?: PickerOption[],
extend ?: UTSJSONObject
}
type PickerModelValue = string | number | null
type PickerEvent = {
selectedValues : PickerModelValue[],
selectedOptions : PickerOption[],
selectedIndex : number[],
}
组件导出如下类型
ts
import { PickerOption, PickerModelValue, PickerEvent } from '@/uni_modules/rice-ui';
//组件类型
const buttonRef=ref<RicePickerComponentPublicInstance|null>(null)