小程序的picker和vue的index被我同时踩到

前提概要:

使用mpvue来写小程序的代码

我的需求

小程序的picker和vue的index被我同时踩到_第1张图片
用picker实现一个循环里面的选择

首先,小程序的picker目前只支持index来定位选中的值。


小程序的picker和vue的index被我同时踩到_第2张图片
picker文档

为了满足我的需求,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又检测不到下标的变更,所以导致,数据变更了,页面上无变化。


小程序的picker和vue的index被我同时踩到_第3张图片
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之类的有效字段。
希望以后这里会被优化吧。

你可能感兴趣的:(小程序的picker和vue的index被我同时踩到)