在本机示例中,他们给了我们这段代码:
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的输入。
答案 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函数也是类型为开关的东西)