uniapp中picker-view(常見的坑)出現選擇值與輸出的值不一致
阿新 • • 發佈:2020-09-14
今天遇見一個問題,在使用picker-view的時候;
出現我選擇的值和輸出的值不一致;
經過與官方的demo做對比發現;
官方是實時的將值從元件中向上丟擲去;
值是從change事件傳遞出去的
而我為了減少實時的想父元件傳遞值;
我將這個值存起來了的;
在使用者點選確認的時候;
我才向上將值丟擲去;
結果發現了一個問題
這個問題就是在我快速選擇的時候;
我選擇的值和輸出的值不一致
因為當我快速選擇的時候,造成非同步;
如何解決:
使用change事件實時的將值丟擲去
元件
下面的程式碼我使用了uni-popup這個彈框元件,這個元件是非常強大的哈;
有時間可以研究一下這個元件
<template> <view> <uni-popup ref="onlyhover" type="bottom" :maskClick=true> <view class="date-select"> <view class="demo-flex"> <view class="select-time"> 選擇時長 </view> <view class="of-sourceof" @click="closemask"> 確認 </view> </view> <picker-view class="picker-view" :value="defaultValue" @pickstart="pickstart" @change="bindChange"> <picker-view-column> <view class="item" v-for="(item,index) in hoverhover" :key="index">{{item}}小時</view> </picker-view-column> </picker-view> </view> </uni-popup> </view> </template>
<script> export default { data() { return { selectscooldata:{}, title: 'picker-view', hoverhover:[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8], defaultValue:[2],//預設選中hoverhover中下標為2的那個元素 //defaultValue是預設展示的值,你要注意,如果hoverhover是動態迴圈出來時,你在data中直接給預設值,可能不能夠顯示你想要展示的值 } }, methods: { pickstart(){ console.log(1) }, /** * uniapp中,向上傳遞值得時候,不要在關閉事件中進行傳遞值; * 因為關閉事件中有可能形成非同步(造成選擇的值和頁面顯示的值不一致這個問題) * 使用change事件將值丟擲去 * */ bindChange(e) { console.log('gundong',e) this.selectscooldata=e; if(e.detail&&e.detail.value ){ //實時將使用者選擇的值丟擲去 this.$emit('changeCont',this.hoverhover[e.detail.value[0]] ) }else{ // 使用者沒有滾動,說明使用者選擇的是我們給使用者展示的預設值 } }, date(e) { this.$refs.onlyhover.open(); }, fatheropen(){ this.$refs.onlyhover.open(); }, fathClose(){ this.$refs.onlyhover.close(); }, /** * 確認按鈕,沒有值得時候去尋找預設值 * */ closemask(){ if(this.selectscooldata.detail&&this.selectscooldata.detail.value ){ // }else{ //此時使用者選擇的是預設值,在點選的時候丟擲去 let cont=this.hoverhover[this.defaultValue[0]]; this.$emit('changeCont',cont ) } } } } </script> <style scoped lang="scss"> .date-select { width: 100%; height: 500rpx; border-top-left-radius: 40rpx; border-top-right-radius: 40rpx; background-color: #FFFFFF; position: relative; .picker-view { background-color: #EEEEEE; position: absolute; width: 100%; height: 388rpx; bottom: 20rpx; .item { height: 88rpx; line-height: 68rpx; font-size: 32rpx; text-align: center; } } .btn{ width: 100%; height: 100rpx; box-sizing: border-box; .btn-left,.btn-right{ color: #FFFFFF; width: 150upx; height: 90upx; line-height: 90upx; text-align: center; border-radius: 15upx; } } } .demo-flex{ display: flex; align-items: center; .select-time{ height:96rpx; line-height: 96rpx; font-size: 32rpx; font-family: "PingFangSC, PingFangSC-Medium"; font-weight: 500; text-align: center; color: #323233; flex: 1; padding-left: 90rpx; } .of-sourceof{ height:96rpx; line-height: 96rpx; font-size: 30rpx; font-family: "PingFangSC, PingFangSC-Regular"; text-align: center; color: #3388ff; padding-right: 32rpx; } } </style>