收藏
回答

wx:for创建组件列表后,数组中的部分数据被删除时,组件列表如何更新

框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
小程序 Bug wx:for 客户端 iOS 6.3.3 2.0.0

更新:


以下是我对下面描述的bug的一个解释。如果我的猜想正确,请告诉我能否强制重新创建组件;如果不正确,请告诉我原因。多谢各位开发者与管理员。


操作:

选择第1、第3本书,删除书目


期望结果:

第1、第3本书被从页面上删除,页面上剩下的图书都是未选择状态


实际结果:

原来的第1、第3本书被从页面上删除,但是页面上剩下的图书里,第1、第3本仍然是被选择状态


原因推测:

当数组的数据变动时,框架并没有把那些被删除的数据对应的组件也删除,而是从前往后保留所需数量的组件,然后把后面多出来的组件删除。这造成的问题是,前面未被删除的组件的内部状态会被保留。



在这个例子里,一开始选择了第1、第3本书,所以第1、第3个booklist-item组件内部的checked属性被设为true。删除了items数组中的第1、第3项后,第1、第3个booklist-item组件并未删除,而仅仅是其中的book属性被替换为新的值。删除的实际是最后两个booklist-item组件,对吗?


临时解决方法:

在删除完书目后,设置isSelecting为false,强制让每个booklist-item组件重置checked属性为false。




原提问:


使用wx:for创建一个列表,列表内每个元素是一个自定义组件。当wx:for使用的数组改变后,并没有重新创建每个组件,而是按照顺序复用了之前创建的组件,且每个组件内部状态保留,只是数据发生变化。


我希望能够重建每个组件,使组件内部数据为初始状态。


如下图,每本书是一个组件:

选中第一本书,组件内部checked == true。然后在数组中删除第一本书后重新setData,可以看到列表直接没有重新创建组件,只是相当于把剩余的数据从第一个组件开始依次传递给每个组件。这造成的问题是,本来第二本书是没有被选中的,现在也被选中了。


只选中第一本,然后点击删除:




删除第一本后,第一个图书组件还是被选择状态:



最后一次编辑于  2018-05-21
回答关注问题邀请回答
收藏

6 个回答

  • Charles Lo
    Charles Lo
    2018-08-05

    试试在每次 setData 后手动调用一下这行代码触发页面重绘

    this.onShow()

    2018-08-05
    有用
    回复
  • 2018-06-30

    遇到相同问题,还没解决方法么?

    我的情况是渲染一个list ,点击按钮在两个数组中拿数据出来渲染,如果没有就做网络获取,如果有就直接赋值

    结果除了第一次的网络能拿到数据,后续调用setdata直接赋值 /  深拷贝 都没用


    2018-06-30
    有用
    回复
  • proto
    proto
    2018-06-21

    我也是遇到相同的问题

    2018-06-21
    有用
    回复
  • 陶小婷
    陶小婷
    2018-04-19

    我也是 遇到相同的问题

    2018-04-19
    有用
    回复
  • 2018-04-16

    一个很简单的列表渲染

    2018-04-16
    有用
    回复
  • 赵青山
    赵青山
    2018-04-16

    感觉像bug,要么就是低级错误

    2018-04-16
    有用
    回复
登录 后发表内容