当前位置:  开发笔记 > 前端 > 正文

ListView.DataSource中rowHasChanged的确切输入是什么

如何解决《ListView.DataSource中rowHasChanged的确切输入是什么》经验,为你挑选了1个好方法。

在本机示例中,它们为我们提供了以下代码:

getInitialState: function() {
    return {
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
      loaded: false,
    };
  },

但是,我似乎无法找到任何描述rowHasChanged功能的简明文档.我们从哪里得到两个输入,row1和row2?什么定义了ListView中的row1和row2?

我在这里查看了Listview的文档:http: //facebook.github.io/react-native/docs/listview.html但是我仍然不确定是什么定义了rowHasChanged的输入.



1> gre..:

TL,DR; 您必须定义rowHasChanged与您为数据源提供的数据相关的内容.

  var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
  return {
    dataSource: ds.cloneWithRows(['row 1', 'row 2']),
  };

在此特定示例中,r1和r2将是一个字符串,因为ds有2个字符串行作为数据.


您可以根据此定义自己的数据格式并实现rowHasChanged.rowHasChanged每次更改数据源行时,基本上都会为每个数据源行条目调用,然后只有重新呈现的行才会重新呈现(rowHasChanged返回时true).

更高级的例子

假设我的DataSource中有这种数据:

[
  { type: DOG, age: 12, name: "Snoopy" },
  { type: CAT, age: 13, name: "Oliver" },
  { type: HUMAN, age: 30, firstName: "Jerome", lastName: "Garcia" }
]

在我的示例格式中,"type"是切换数据类型的必填字段,"age"是可用于所有类型的字段,然后是特定字段.

然后我可以实现rowHasChanged:

const rowHasChanged = (r1, r2) => {
  if (r1.type !== r2.type) return true;
  if (r1.age !== r2.age) return true;
  switch (r1.type) {
    case DOG:
    case CAT:
      return r1.name !== r2.name;
    case HUMAN:
      return r1.firstName !== r2.firstName || r1.lastName !== r2.lastName;
    default:
      throw new Error("Unsupported type "+r1.type);
  }
}

^那样,只有一行按照我的格式真正改变才会呈现.

(你可以想象我的renderRow函数也是类型为开关的东西)

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有