前提概要:
使用mpvue来写小程序的代码
我的需求
首先,小程序的picker目前只支持index来定位选中的值。
为了满足我的需求,picker 的回调里面必须拿到以下两点:
1,得到当前我选择项目在picker里面的arr的index 2,我当前修改的是for循环的哪一项
做法
picker在回调是change方法。
-
{{levels[item.level].label}}
(这里属性在data里面的定义过程省略)
所以是在我定义的handleLevelChange
里面做。
但是
picker的change
只支持一个回调参数。也就是 e
.这个里面可以通过
let index = e.mp.detail.value
// 以上便是当前选择的picker的index。
那么修改的是当前的哪一项里面的picker呢?
这个怎么做?
办法:
:data-id="item.value"
:data-levelIndex="index"
通过小程序的data-XX
来写自定义的属性,通过这样的方式把当前修改的index
放到 dataset
里面。这样在picker的change
事件里面就可以拿到当前的index
.然后再来修改当前list里面对应的这个index
里面的level的值。
于是我写成了这样:
let pickerIndex = e.currentTarget.dataset.levelindex // 当前修改的哪一项
let itemIndex = e.mp.detail.value // 选择了picker里面的哪个值的index
this.skillMaps[pickerIndex].level = itemIndex
// 再修改被循环的skillMaps 对应的index 里面的 level 来达到改变view上显示的目的
结果就是:
失败!!
页面上没有正确显示,但是我的APPDATA里面看,数据是更改了(也就是数据变成了level = 2 ,那么就应该显示精通,但是实际上还是显示的入门)。
经过我的一番调查,是vue的坑(因为我用的是mpvue)。
由于小程序的picker更改的是下标,但是vue又检测不到下标的变更,所以导致,数据变更了,页面上无变化。
根据官网建议,为了解决这个问题,做了以下的操作。
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数,让他被检测到。
以上便是小程序的picker和Vue的index无法被检测,这两个问题,同时被我遇到的问题。
其实小程序picker只能用index来定位,这个我表示体验不好。因为正常的使用情景都不是index是value或者id之类的有效字段。
希望以后这里会被优化吧。