收藏
回答

setData以路径更新的方式增加数组元素时,数组长度不会正确更新

问题模块 框架类型 问题类型 终端类型 微信版本 基础库版本
框架 小程序 Bug 客户端 6.7.3 2.4.0

- 当前 Bug 的表现(可附上截图)


数组元素增加了,数组长度没变。


- 预期表现


数组长度正确变化


- 复现路径


https://github.com/NervJS/taro/issues/882#issuecomment-440127031


- 提供一个最简复现 Demo


<!-- index.wxml -->
<block>
  <view class="container">
    <text wx:for="{{contents}}" wx:for-item="item">{{item.text}}</text>
    <button bindtap="add">add line by path</button>
    <button bindtap="add2">add line by replace array</button>
    <button bindtap="log" data-content="{{contents}}" data-content-length="{{contents.length}}">show log</button>
    <button disabled="{{contents.length ? false : true}}">{{contents.length}}</button>
  </view>
</block>
let i = 0
 
Page({
  data: {
    contents: [],
  },
  add () {
    this.setData({
      [`contents[${i++}]`]: { text: 'test' }
    })
  },
  add2() {
    this.setData({
      contents: [...this.data.contents, { text: 'test' }]
    })
  },
  log (ev) {
    console.log({
      contentLength: ev.currentTarget.dataset.contentLength,
      content: ev.currentTarget.dataset.content
    })
  }
})


最后一次编辑于  2018-11-20  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

2 个回答

  • 是柿子啊
    是柿子啊
    2018-11-20

    提供下相关的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)

    2018-11-20
    赞同
    回复 1
  • 胡先生
    胡先生
    2018-11-22

    你好,请问复现了吗

    2018-11-22
    赞同
    回复 4
    • Link
      Link
      2018-11-22

      问题已复现,跟进处理中。

      2018-11-22
      回复
    • LastLeaf
      LastLeaf
      2018-11-22

      感谢反馈。问题已复现,原因我们也知道了。但是这个问题修复起来有顾虑(主要是完美修复的话会有 setData 性能问题),所以估计不会很快修复,抱歉。


      这里建议先用另一个变量专门存储和更新 arrayLength ,或者在数组项目改变时直接 setData 数组本身。

      2018-11-22
      回复
    • 胡先生
      胡先生
      2018-12-17回复LastLeaf

      你好,这个问题怎么样了,没有计划修复吗,setData整个数组性能太差了

      2018-12-17
      回复
    • LastLeaf
      LastLeaf
      2018-12-17回复胡先生

      看起来短期内不会修复(目前还没有好的方案)。担心性能问题的话,单列一项 arrayLength 来单独更新比较好。

      2018-12-17
      回复