微信小程序picker 双列案例

这篇博客展示了如何在微信小程序中使用`picker`组件实现多列联动选择的效果。通过`bindchange`和`bindcolumnchange`事件处理函数,动态更新不同列的选择项,从而实现联动选择的功能。示例代码包括了`wxml`页面结构和对应的`js`逻辑,涉及数据绑定和事件响应,是前端开发中关于微信小程序交互设计的一个实例。

直接上代码:

wxml页面

<picker mode="multiSelector" range="{{ multiItems }}" bindchange="handleMulti" bindcolumnchange="handleColumn">
  <view>点击选择:{{ multiItems[0][multiIndex[0]] }} {{ multiItems[1][multiIndex[1]] }}</view>
</picker>

js逻辑页面

// pages/pikcer/picker.js
Page({

  /**
   * 页面的初始数据
   */
  data: {   
    multiItems: [['飞禽', '走兽'], ['鹰', '鸽子', '麻雀', '鹦鹉']],
    multiIndex: [0, 0],
    arrColumn0: ['鹰', '鸽子', '麻雀', '鹦鹉'],
    arrColumn1: ['兔子', '狮子', '猎狗']
},
  handleMulti(e){
    this.setData({
      multiIndex : e.detail.value
    })
  },
  handleColumn(e){
    var obj = e.detail
    var multiArray = this.data.multiItems
    if (obj.column == 0 && obj.value == 0) {
     multiArray[1] = this.data.arrColumn0
    }
    if (obj.column == 0 && obj.value == 1) {
     multiArray[1] = this.data.arrColumn1
    }
    this.setData({
     multiItems: multiArray
    })
  }
})

<think>好的,用户需要手写实现微信小程序中的多列picker选择器,并希望得到示例代码。首先,我需要回忆一下微信小件的picker组件的使用方法,尤其是多列模式。根据引用[2]和[3],多列选择器使用mode="multiSelector",并且需要处理bindchange和bindcolumnchange事件。用户想要自定义实现,可能包括数据绑定、动态更新选项以及显示选中结果等步骤。 首先,确定基本结构。picker组件需要设置mode为multiSelector,绑定range和value。range应该是一个二维数组,每一列对应一个子数组。value是一个数组,表示各列当前选中的索引。然后,事件处理方面,bindcolumnchange在列变化时触发,比如某一列滚动选择了新的项,这时可能需要更新其他列的选项,例如级联选择的情况。而bindchange则是在最终确定选择时触发,用于获取所有列的选中值。 接下来,数据准备。用户可能需要一个多层级的数据结构,比如省市区三级联动。这里可能需要递归或动态加载数据,但示例中为了简单,可以使用静态数据。例如,第一列是类型,第二列是子类型,根据第一列的选择动态改变第二列的选项。根据引用[3],当某一列变化时,需要更新对应的range数据,比如supportTypeRange,并设置currentSupport来保存当前各列的索引。 然后,处理数据绑定。在WXML中,picker的range绑定multiArr,即多列的数据源,value绑定multiIndex,即各列选中的索引。当用户滚动某一列时,bindcolumnchange事件会被触发,事件对象中包含了变化的列和新的索引。这时需要更新multiIndex,并根据新的索引更新后续列的数据。例如,如果第一列从0变为1,那么第二列的数据需要从multiArr[1]中获取,并重置第二列的索引为0。 最后,显示选中结果。当用户点击确定后,bindchange事件触发,可以通过multiIndex从multiArr中获取选中的值,并更新到页面上。 需要注意,微信小程序picker的多列数据是静态的,如果需要动态更新某一列的选项,必须在数据变化后调用this.setData来更新视图。此外,处理级联选择时,需要确保在columnchange事件中正确更新后续列的数据和索引,避免数组越界等问题。 现在,结合这些步骤,可以编写一个示例代码。首先在data中定义multiArr和multiIndex。multiArr是一个二维数组,例如第一列是类型,第二列是子类型。当某一列变化时,检查是否需要更新后续列的数据。例如,第一列变化时,更新第二列的选项,并重置第二列的索引为0。在bindchange事件中,遍历multiIndex,从multiArr中取出对应的值,组合成最终结果。 测试时需要注意,初始数据是否正确加载,各列能否根据前一级的选择动态更新,以及最终结果是否正确显示。此外,性能方面,如果数据量较大,可能需要优化数据加载方式,避免卡顿。 总结,实现多列picker的关键点包括:正确设置mode和绑定数据,处理列变化事件更新后续数据,以及在确认选择后获取并显示结果。参考引用[2]和[3]中的案例,可以确保代码结构正确,事件处理逻辑清晰。</think>以下是如何手写实现微信小程序多列picker选择器的完整实现方案: ### 一、基础实现原理 多列选择器通过`mode="multiSelector"`实现级联数据绑定,核心要素包含: 1. 二维数组数据源结构 2. 索引值绑定与动态更新 3. 列变化联动处理[^2] ### 二、完整代码实现 ```javascript // page.js Page({ data: { multiArr: [ ['食品', '数码'], // 第一列数据 ['水果', '零食'], // 第二列数据(初始对应食品类) ['苹果', '香蕉'] // 第三列数据(初始对应水果类) ], multiIndex: [0, 0, 0], // 各列当前选中索引 result: '' // 显示结果 }, // 列选项变化事件 bindColumnChange(e) { const { column, value } = e.detail const newIndex = this.data.multiIndex.slice() newIndex[column] = value // 动态更新后续列数据 if (column === 0) { // 第一列变化时更新第二列 const secondColumn = [ [['水果', '零食'], ['米面', '调料']], // 食品类子项 [['手机', '平板'], ['配件', '耳机']] // 数码类子项 ][value] this.setData({ [`multiArr[1]`]: secondColumn, [`multiIndex[1]`]: 0 }) } if (column <= 1) { // 前两列变化时更新第三列 const thirdColumn = [ [ // 食品类 [['苹果', '香蕉'], ['大米', '面粉']], // 水果/米面 [['饼干', '巧克力'], ['酱油', '醋']] // 零食/调料 ], [ // 数码类 [['iPhone', 'iPad'], ['保护壳', '贴膜']], // 手机/配件 [['蓝牙', '有线'], ['充电器', '数据线']] // 耳机相关 ] ][this.data.multiIndex[0]][newIndex[1]] this.setData({ [`multiArr[2]`]: thirdColumn, [`multiIndex[2]`]: 0 }) } this.setData({ multiIndex: newIndex }) }, // 确认选择事件 bindMultiChange(e) { const values = this.data.multiArr.map( (col, index) => col[this.data.multiIndex[index]] ) this.setData({ result: `已选择:${values.join(' - ')}` }) } }) ``` ```html <!-- page.wxml --> <picker mode="multiSelector" range="{{multiArr}}" value="{{multiIndex}}" bindchange="bindMultiChange" bindcolumnchange="bindColumnChange"> <view class="picker">点击选择商品分类</view> </picker> <view>{{result}}</view> ``` ### 三、关键实现逻辑说明 1. **数据层级结构**:使用三维数组维护级联关系 - `multiArr[0]`:第一级选项 - `multiArr[1]`:根据第一级选择的二级选项 - `multiArr[2]`:根据第二级选择的三级选项 2. **动态更新机制**: - 通过`bindcolumnchange`监听列变化[^3] - 使用`setData`动态更新后续列数据源 - 重置后续列的选中索引为初始值 3. **数据绑定技巧**: ```javascript this.setData({ [`multiArr[1]`]: newData // 使用计算属性名更新数组指定位置 }) ``` ### 四、扩展优化建议 1. **数据加载优化**:对大数据量使用分页加载 2. **样式自定义**:通过`picker-view`组件实现更复杂的UI 3. **异常处理**:添加数据校验逻辑
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少杰()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值