前提概要:
使用mpvue來寫小程序的代碼
我的需求
首先倔丈,小程序的picker目前只支持index來定位選中的值圈澈。
為了滿足我的需求顶考,picker 的回調(diào)里面必須拿到以下兩點:
1,得到當前我選擇項目在picker里面的arr的index 2展箱,我當前修改的是for循環(huán)的哪一項
做法
picker在回調(diào)是change方法羊赵。
<ul class="select-con">
<li v-for="(item, index) in skillMaps"
class="select-item"
:key="index">
<van-icon :name="deleteIcon" class="vant-icon" @click="deleteSelectedItem(item, index)"/>
<picker
:range="levels"
range-key="label"
:data-id="item.value"
:data-levelIndex="index"
class="level-picker"
:value="item.level"
@change="handleLevelChange">
<view class="list-item">
<label class="label-value">{{item.label}}</label>
<div class="action-con">
<span class="label-value">{{levels[item.level].label}} </span>
<van-icon name="arrow" :color='color' @click="showPicker" class="vant-icon"/>
</div>
</view>
</picker>
</li>
</ul>
(這里屬性在data里面的定義過程省略)
所以是在我定義的handleLevelChange
里面做舷蒲。
但是
picker的change
只支持一個回調(diào)參數(shù)耸袜。也就是 e
.這個里面可以通過
let index = e.mp.detail.value
// 以上便是當前選擇的picker的index。
那么修改的是當前的哪一項里面的picker呢牲平?
這個怎么做堤框?
辦法:
:data-id="item.value"
:data-levelIndex="index"
通過小程序的data-XX
來寫自定義的屬性,通過這樣的方式把當前修改的index
放到 dataset
里面。這樣在picker的change
事件里面就可以拿到當前的index
.然后再來修改當前l(fā)ist里面對應的這個index
里面的level的值胰锌。
于是我寫成了這樣:
let pickerIndex = e.currentTarget.dataset.levelindex // 當前修改的哪一項
let itemIndex = e.mp.detail.value // 選擇了picker里面的哪個值的index
this.skillMaps[pickerIndex].level = itemIndex
// 再修改被循環(huán)的skillMaps 對應的index 里面的 level 來達到改變view上顯示的目的
結果就是:
失斊啤!资昧!
頁面上沒有正確顯示酬土,但是我的APPDATA里面看,數(shù)據(jù)是更改了(也就是數(shù)據(jù)變成了level = 2 格带,那么就應該顯示精通撤缴,但是實際上還是顯示的入門)。
經(jīng)過我的一番調(diào)查叽唱,是vue的坑(因為我用的是mpvue)屈呕。
由于小程序的picker更改的是下標,但是vue又檢測不到下標的變更棺亭,所以導致虎眨,數(shù)據(jù)變更了,頁面上無變化镶摘。
根據(jù)官網(wǎng)建議嗽桩,為了解決這個問題,做了以下的操作凄敢。
handleLevelChange (e) {
let pickerIndex = e.currentTarget.dataset.levelindex
let itemIndex = e.mp.detail.value
this.$set(this.skillMaps, pickerIndex, {...this.skillMaps[pickerIndex], level: itemIndex})
},
// 使用$set 來重新渲染當前的dom數(shù)碌冶,讓他被檢測到。
以上便是小程序的picker和Vue的index無法被檢測涝缝,這兩個問題扑庞,同時被我遇到的問題。
其實小程序picker只能用index來定位拒逮,這個我表示體驗不好罐氨。因為正常的使用情景都不是index是value或者id之類的有效字段。
希望以后這里會被優(yōu)化吧滩援。