- 当前 Bug 的表现(可附上截图)
第一次点击按钮,list 渲染正常。dom 结构为:
第二次点击按钮,list 渲染错误。dom 结构为:
- 预期表现
第二次点击按钮后,data-x 的值应该从上往下分别为 0~6,但此时却仍然是第一次渲染 list 时的 data-x。
证明这种情况下,按路径的方式 setData 时,列表属性值没有更新。
- 复现路径
1. 点击一次按钮,观察列表的 dom。
2. 第二次点击按钮,再观察列表 dom 的 data-x。
- 提供一个最简复现 Demo
index.js
Component({ data: { list: [], i: 0 }, methods: { onButtonClick() { if ( this .data.i === 0) { this .setData({ 'list[0]' : { idx: "0" , str: "back off" }, 'list[1]' : { idx: "1" , str: "now" }, 'list[2]' : { idx: "2" , str: "point" }, 'list[3]' : { idx: "3" , str: "simple" }, 'list[4]' : { idx: "4" , str: "total" }, 'list[5]' : { idx: "5" , str: "pity" }, 'list[6]' : { idx: "6" , str: "name" }, i: 1 }) } else if ( this .data.i === 1) { this .setData({ 'list[0].str' : "point" , 'list[1].str' : "back off" , 'list[2].str' : "simple" , 'list[3].str' : "pity" , 'list[4].str' : "name" , 'list[5].str' : "total" , 'list[6].str' : "now" , i: 2 }) } }, anonymousFunc0(e) { console.log( 'e: ' , e.target.dataset.x) } } }) |
index.wxml
< block > < view > < button bindtap = "onButtonClick" >Generate random items</ button > < view wx:key = "str" bindtap = "anonymousFunc0" wx:for = "{{list}}" data-x = "{{item.idx}}" >{{item.str}}</ view > </ view > </ block > |
感谢反馈。
已经查清楚是个什么 bug 了。大体上是这样:如果在尝试修改 key 对应值,目前基础库会尝试修改列表中 item 的顺序,而不会尝试比对除 key 以外的其他 item 内容,也就导致 item 顺序变了但是 data-x 没有正确调整。
我们会尝试修复这个 bug ,但是看起来不太好修复,短期内这个问题还会存在。
在你的场景中,可以尝试这样做:修改 key 对应值的时候,使用 setData 设置整个 item (而不是仅设置 key 对应值),如:
this.setData({ 'list[0].key': 'xxx' })
改为:
this.setData({ 'list[0]': { key: 'xxx', data: this.list[0].data } })
还没修复,应该合length那个一样估计修复不了了
改一下key
使用 index 作为 key,是反优化。
绕过此问题很简单,但这个 bug 没打算修复?