有了这个组件,我们是不是能想到:在一个弹出view中设置三个picker-view组件,每个组件中放一个picker-view-column组件用于展示当前列?
value中也可以只放一个number(通常可以放数组元素下标),picker-view会自动将其转为 [下标值]
就像这样:
<view style="width:100%;position:fixed;bottom:0;left:0;z-index:10000;height:500rpx;background-color:white"> <!-- 仿原生picker的“确定”和“取消”按钮 --> <view style="display:flex;width:100%;height:100%"> <view style="position: absolute;top:0;width:100%;height:100rpx;z-index:1000000;display:flex;justify-content:space-between;align-items:center;"> <view style="width:calc(100% / 3);text-align:center;color:rgba(0,0,0,.6);font-size:39rpx" bindtap="displayer">取消 </view> <view style="width:calc(100% / 3);text-align:center;color:rgb(63,142,255);font-size:39rpx" bindtap="confirm">确定 </view> </view> <picker-view indicator-style="height: 200rpx;" style="width: 100%;height: 300rpx;text-align: center;margin-top:150rpx" value="{{pIndex}}" bindchange="changeProvince"> <picker-view-column> <view wx:for="{{placeArray}}" wx:key="name" style="line-height: 77rpx">{{item.name}}</view> </picker-view-column> </picker-view> <picker-view indicator-style="height: 200rpx;" style="width: 100%;height: 300rpx;text-align: center;margin-top:150rpx" value="{{cIndex}}" bindchange="changeCity"> <picker-view-column> <view wx:for="{{placeArray[pIndex].city}}" wx:key="name" style="line-height: 77rpx">{{item.name}}</view> </picker-view-column> </picker-view> <picker-view indicator-style="height: 200rpx;" style="width: 100%;height: 300rpx;text-align: center;margin-top:150rpx" value="{{aIndex}}" bindchange="changeArea"> <picker-view-column> <view wx:for="{{placeArray[pIndex].city[cIndex].area}}" wx:key="*this" style="line-height: 77rpx">{{item}} </view> </picker-view-column> </picker-view> </view> </view>
可以看到,每一个picker-view-column中做的唯一一件事就是:遍历固定的某一列(某一个数组)并渲染出来。
然后如
// js-data data:{ placeArray: placeArray, province: "",//placeArray[0].name - 省 pIndex: 0, city: "",//placeArray[0].city[0].name - 市 cIndex: 0, area: "",//placeArray[0].city[0].area[0] - 区 aIndex: 0, }
上wxml中为每一列(picker-view)都绑定了一个change函数——滑动时触发:
changeProvince: function(e){ const val = e.detail.value this.setData({ pIndex: val, cIndex: 0, aIndex: 0, province: placeArray[val].name, city: placeArray[val].city[0].name, area: placeArray[val].city[0].area[0] }) }, changeCity: function(e){ const val = e.detail.value this.setData({ cIndex: val, aIndex: 0, city: placeArray[this.data.pIndex].city[val].name, area: placeArray[this.data.pIndex].city[val].area[0] }) }, changeArea: function(e){ const val = e.detail.value this.setData({ aIndex: val, area: placeArray[this.data.pIndex].city[this.data.cIndex].area[val] }) },
他们的作用就是把当前选择列的选中元素(出现在indicator-style视野中的元素)暴露到页面上,并将下标定位到这里 —— 以便在页面无刷新下的下一次点开时从这里开始找!
然后最重要的一点就是:在滑动停止时,将另外两列的数据重新定位到第一个!
——当然,你也可以选择在一个picker-view中放置多个picker-view-column组件,这样的话就和上面多列picker一样,需要多个数组联动来传递数据了!
总结
到此这篇关于微信小程序自定义yPicker组件实现省市区三级联动功能的文章就介绍到这了,更多相关微信小程序自定义yPicker组件内容请搜索
更多ECSHOP内容来自木庄网络博客
标签:ECSHOP
相关阅读 >>
国内一些常用php的cms的nginx服务器的伪静态规则整理
更多相关阅读请进入《ECSHOP》频道 >>