微信小程序中picker组件的简单用法

1. picker组件简介

小程序中的picker组件是用来提供一个可滚动选择的列表,它可以帮助用户更快捷地选择自己需要的内容,比如日期、地址、颜色等等。此外该组件还可以通过设置mode属性实现多种选择模式。

1.1 picker组件的用法

picker组件分为两部分:外部容器picker和内部选择器picker-view。外部picker的作用是控制选择器的显示和隐藏,而内部picker-view则是提供数据选择的核心部分。

让我们来看一下picker组件最基本用法:

// 在wxml文件中定义

<view class="picker-wrapper">

<picker mode="date" value="{{date}}" start="{{startDate}}" end="{{endDate}}" bindchange="onDatePickerChange">

<view class="picker-label">{{date}}</view>

</picker>

</view>

// 在js文件中定义

Page({

data: {

startDate: '1970-01-01',

endDate: '2100-12-31',

date: '2022-12-31'

},

onDatePickerChange(event) {

console.log(event.detail.value)

this.setData({

date: event.detail.value

})

}

})

在上面的例子中,我们定义了一个mode为'date'的picker,它的起始日期为1970-01-01,终止日期为2100-12-31,并且默认选择了2022-12-31这一天。当用户选择日期时,页面会触发bindchange事件,我们可以通过event.detail.value获取到用户选择的日期,并将其赋值给data中的date变量。这样页面上显示的日期就会自动更新。

除了提供日期选择,picker组件还支持多种选择模式,包括selector、multiSelector、time、region等等。以下是一个例子,可以展示picker组件在selector模式下的用法:

// 在wxml文件中定义

<view class="picker-wrapper">

<picker mode="selector" range="{{fruitList}}" bindchange="onPickerChange">

<view class="picker-label">{{fruitList[fruitIndex]}}</view>

</picker>

</view>

// 在js文件中定义

Page({

data: {

fruitList: ['苹果', '香蕉', '橘子', '草莓', '葡萄'],

fruitIndex: 0

},

onPickerChange(event) {

console.log(event.detail.value)

this.setData({

fruitIndex: event.detail.value

})

}

})

在上面的例子中,我们定义了一个mode为'selector'的picker,它的range为fruitList数组(包含'苹果', '香蕉', '橘子', '草莓', '葡萄'),默认选择了第一个元素'苹果'。当用户选择水果时,页面会触发bindchange事件,我们可以通过event.detail.value获取到用户选择的水果下标,并将其赋值给data中的fruitIndex变量。这样页面上显示的水果名称就会自动更新。

2. picker组件的高级用法

2.1 设置初始化选中项

在picker组件中,我们可以通过value属性设置picker-view在初始化时默认选中的项。value属性的值是一个数组,表示需要选中的节点的index值,例如[0, 1]表示选中第1列的第2个元素。

// 在wxml文件中定义

<view class="picker-wrapper">

<picker mode="multiSelector" range="{{list}}" value="{{[1, 2]}}" bindchange="onPickerChange">

<view class="picker-label">{{list[0][1]}}, {{list[1][2]}}</view>

</picker>

</view>

// 在js文件中定义

Page({

data: {

list: [

['1', '2', '3'],

['a', 'b', 'c', 'd']

]

},

onPickerChange(event) {

console.log(event.detail.value)

}

})

在上面的例子中,我们展示了在multiSelector模式下,设置默认选中值的方法。我们通过value属性将第1列的第2个元素和第2列的第3个元素初始化为选中状态。

2.2 设置自定义选择器样式

在picker组件中,我们可以通过设置style属性来自定义选择器的样式。style属性接受一个css样式对象,可以设置的属性包括:picker、picker-view、picker-view-column。

// 在wxml文件中定义

<picker mode="selector" range="{{fruitList}}" bindchange="onPickerChange" style="background-color: cyan;">

<view class="picker-label">{{fruitList[fruitIndex]}}</view>

</picker>

在上面的例子中,我们设置了picker的背景颜色为青色(cyan)。

2.3 动态更新选择器数据

如果我们想要动态改变一个picker的数据(比如为一个下拉框提供动态选项),我们可以借助picker组件提供的setData方法:

// 在wxml文件中定义

<picker mode="selector" range="{{fruitList}}" bindchange="onPickerChange">

<view class="picker-label">{{fruitList[fruitIndex]}}</view>

</picker>

// 在js文件中定义

Page({

data: {

fruitList: ['苹果', '香蕉', '橘子', '草莓', '葡萄'],

fruitIndex: 0

},

onLoad() {

// 模拟异步请求

setTimeout(() => {

const newList = ['桃子', '西瓜', '樱桃', '橙子']

this.setData({

fruitList: newList

})

}, 2000)

},

onPickerChange(event) {

console.log(event.detail.value)

this.setData({

fruitIndex: event.detail.value

})

}

})

在上面的例子中,我们模拟了一个异步请求,2秒后将数据源中的水果列表改为了'桃子', '西瓜', '樱桃', '橙子'。此时我们可以调用setData方法,将新的数据覆盖掉旧数据,这样picker组件会自动触发页面重渲染,并实时更新选择器的选项。

2.4 设置选择器的文案

在picker组件中,我们可以通过设置picker-view-column元素的content属性为一个数组,来自定义选择器每一项的文案。例如下面的例子中,我们把水果列表的值改为了{label: '榴莲', value: 'liulian'}这样的对象,然后通过设置content属性,来指定文案的显示方式。

// 在wxml文件中定义

<picker mode="selector" range="{{fruitList}}" bindchange="onPickerChange">

<picker-view-column>

<view wx:for="{{fruitList}}" wx:key="{{index}}">{{item.label}}</view>

</picker-view-column>

</picker>

// 在js文件中定义

Page({

data: {

fruitList: [

{label: '苹果', value: 'pingguo'},

{label: '香蕉', value: 'xiangjiao'},

{label: '橘子', value: 'juzi'},

{label: '草莓', value: 'caomei'},

{label: '葡萄', value: 'putao'}

],

fruitIndex: 0

},

onPickerChange(event) {

console.log(event.detail.value)

this.setData({

fruitIndex: event.detail.value

})

}

})

在上面的例子中,我们将fruitList改为了数组对象,并通过wx:for循环生成选择器列的文案。选择器每一项文案的显示方式由item.label来决定。

2.5 picker组件嵌套

在一些复杂的表单场景中,我们可能需要多级下拉框,此时可以通过picker组件嵌套的方式来解决。例如下面的例子,我们定义了一个两级地区选择器,用户先选择省份,再选择城市:

// 在wxml文件中定义

<view class="picker-wrapper">

<picker mode="selector" range="{{provinceList}}" bindchange="onProvinceChange" style="width: 50%;">

<view class="picker-label">{{provinceList[provinceIndex].label}}</view>

</picker>

<picker mode="selector" range="{{cityList}}" bindchange="onCityChange" style="width: 50%;">

<view class="picker-label">{{cityList[cityIndex].label}}</view>

</picker>

</view>

// 在js文件中定义

Page({

data: {

provinceList: [

{label: '北京市', value: 'bj'},

{label: '上海市', value: 'sh'},

{label: '广东省', value: 'gd'},

{label: '河北省', value: 'hb'}

],

provinceIndex: 0,

cityList: [

{label: '北京市', value: 'bj'},

{label: '上海市', value: 'sh'},

{label: '广州市', value: 'gz'},

{label: '深圳市', value: 'sz'},

{label: '天津市', value: 'tj'},

{label: '石家庄市', value: 'sjz'},

{label: '唐山市', value: 'ts'}

],

cityIndex: 0

},

onProvinceChange(event) {

console.log(event.detail.value)

const provinceIndex = event.detail.value

const cityList = this.getCityList(provinceIndex)

this.setData({

provinceIndex: provinceIndex,

cityList: cityList,

cityIndex: 0

})

},

onCityChange(event) {

console.log(event.detail.value)

this.setData({

cityIndex: event.detail.value

})

},

getCityList(provinceIndex) {

const cityMap = {

bj: [

{label: '北京市', value: 'bj'}

],

sh: [

{label: '上海市', value: 'sh'}

],

gd: [

{label: '广州市', value: 'gz'},

{label: '深圳市', value: 'sz'}

],

hb: [

{label: '石家庄市', value: 'sjz'},

{label: '唐山市', value: 'ts'}

]

}

const provinceValue = this.data.provinceList[provinceIndex].value

return cityMap[provinceValue] || []

}

})

在上面的例子中,我们先定义了两个picker,分别表示省份和城市的选择框。当用户选择省份时,我们通过onProvinceChange方法动态生成城市数据,并设置城市选择器的数据和当前选中项。

3. picker组件的优缺点

3.1 优点

简单易用 — picker组件非常易于使用,只需要几行代码就可以实现基本的下拉框、日期选择框等效果。

功能强大灵活 — picker组件不仅支持单列数据选择,还可以实现多列、日期、时间、颜色等各种选择模式,通过自定义样式可以实现更灵活的视觉效果。

代码复用度高 — picker组件可以在不同的小程序中复用,不需要重新开发或者修改代码,降低了开发成本和维护难度。

3.2 缺点

视觉效果较为单一 — picker组件的视觉效果固定,只能够通过样式自定义来实现丰富的视觉效果,相对于UI自定义度更高的select组件来说,视觉效果有所欠缺。

容易出现选择器数据显示错误问题 — 在实际开发中,我们可能需要动态更新选择器的数据,但是如果更新数据不及时或者方法不正确,就有可能导致选择器数据显示错误的问题。

4. 结语

通过本文,我们详细介绍了小程序中picker组件的简单用法、高级用法和优缺点分析。虽然picker组件存在一些缺点,但它仍然是我们在小程序开发中常用的组件之一。在实际项目中,开发者可以根据具体的业务需求,来选用不同的选择组件做处理。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。