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

时间:2016-01-11 06:13:18

标签: react-native

在本机示例中,他们给了我们这段代码:

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 个答案:

答案 0 :(得分:20)

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时)。 / p>

更高级的例子

假设我的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函数也是类型为开关的东西)