为什么setState不会重新渲染Listview



  • 如题,this.setState语句让按钮组件被重新渲染了,但Listview依旧没变,想实现的功能是点击Listview中的一项后,该项的背景色改变,调了好久Listview也不会重新渲染,来问问大家有没有什么办法能解决,谢谢。



  • 0_1480238041671_val.png
    图片中的HousesData是当前js文件的全局变量

    0_1480238063621_tans.png
    在fetch到数据后,转换成jason格式并存入HousesData,再赋给dataSource准备渲染Listview

    0_1480238093083_set.png
    ListView中的每一个项都有一个onPress监听函数,被点击后,会将该项数据中的FlagLook置为 1 以标识被点击过了(之前通过alert确认过确实该变量被成功置1了),并重新以setState的方式赋值给dataSource,想以此来达到改变数据源中的数据并且重新渲染页面的目的

    0_1480238101898_sty1.png
    0_1480238106298_sty2.png
    最后在这两个地方(每一项的背景色和每一项显示的文字)根据FlagLook来设置不同的背景色

    按理说,某一项被点击后,该项的FlagLook值被置1,重新渲染后该项的背景色和显示的文字应该也随FlagLook值的变化而发生改变,但实际情况中却没有达到预想的效果,貌似ListView没有被重新渲染,但ListView之外的其他组件被重新渲染了。(之前在多次点击未变色的过程中偶然出现过两次成功变色,没有改动代码,不知原因何在)
    @sunnylqm 大神能帮忙看看吗,谢谢



  • dataSource刚开始是不是要初始化一下



  • @打得不错
    setState会触发render,但render未必导致ListView刷新
    ListView有点特殊,必须修改datasource才会更新。datasource的修改必须通过调用cloneWith方法,这个方法多半是接受一个数组。这里就还存在一个问题,数组是引用型数据,所以如果你只在原数组上修改,其引用地址不会变,那么cloneWith方法会认为数组没有变化。所以你还需要想办法得到一个“新”数组。请仔细阅读ListView.Datasource文档。



  • 0_1480255099869_datasource.png



  • @sunnylqm
    谢谢指点!之前按你说的思路,构建一个“新”的数组,但个人在这里遇到了困难。
    后来照这个思路稍微做了下改动,变成 构建一个“新”数据源:
    0_1480316501526_ds.png
    0_1480316522297_ds2.png
    如图,具体做法是 构造一个Bool 型刷新标志(RefreshVal),每次点击都使该标志取反,并根据该标志交替使用两个数据源(dataSource和dataSource2),成功达到了重新渲染ListView的目的。不过有一个小细节,使用其中一个数据源时,需将另一个数据源置空,不然尽管交替使用,ListView依然不会重新渲染。
    最后再次感谢大神sunnylqm的帮助,希望可以帮到有同样困扰的小伙伴。



  • @打得不错 我只能说这个做法不值得推荐



  • @打得不错 请问我现在listview是分页加载的,我点击第一页的按钮,他的状态发生了变化,第二页的一个item的按钮没有任何变化,这事该怎么处理啊?有没有什么好的思路啊?谢谢



  • 你好 可以渲染了么