在微信小程序中如果使用了wx:for进行渲染时,由于同时生成了很多一样的dom。这时候如果想知道当前处理的是哪个对象,则需要在事件中进行传参,方法如下:

<view data-xxx="{{xxx}}" bindonchange="bindOnChange">
</view>

此时,当触发bindOnChange事件时,便可以在 C 中接收到使用data-xxx传入的参数了.

bindOnChange(e) {
    console.log(e.currentTarget.dataset.xxx);
    console.log(e.target.dataset.xxx);
}

但是不知道微信出于什么目的,当使用data-xxx来绑定数据时,竟然使用的不是地址传递,取而代之是进行值复制。比如:

  data: {
    xxx: {value: 123}
  },
  bindOnChange(e) {
    const xxx = e.currentTarget.dataset.xxx;
    xxx.value = 234;
    console.log(this.data.xxx.value);  // 结果仍然是123
  }

我想没有使用简单的地址传递而是取而代之了更复杂的值传递可能是为了照顾新手或是降低小程序框架的难度吧。

另外还有个小坑是,它的语法是:data-xxx="{{foo}}",此时它会复制C层(实际上应该是 C 层中的数据复制(非值传递)到了 V 层)中的data.foo复制过去。如果语法不小心写成data-xxx="foo", 那么此时的foo将做为字符串处理。



潘杰
3.1k 声望239 粉丝