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

标签 react-native

在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的输入。

最佳答案

TL,DR;您必须定义与您提供给数据源的数据相关的rowHasChanged

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

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

由您决定自己的数据格式并根据此实现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" }
]

在我的示例格式中,“类型”是切换数据类型的必填字段,“年龄”是所有类型都可用的字段,然后是特定字段。

然后我可以实现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函数也可以在类型上进行切换)

关于react-native - ListView.DataSource中rowHasChanged的确切输入是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715217/

相关文章:

javascript - 在yield调用完成之前yield put被触发

javascript - 在 map 完成后返回一个 object.map() 内部

react-native - 让 react-native-fbsdk 与 CocoaPods 一起工作

javascript - Reactjs API错误 'TypeError: fetch(...).then(...).then(...).done is not a function'

android - 当我的 android 版本为 6+ 时,为什么 android/google play 要求我的 react native 应用程序的权限?

reactjs - 无状态函数组件不能有引用

javascript - React-Native Undefined 不是一个对象(正在评估 'this.refs.[' DRAWER'])

javascript - 使用 axios 发布和获取请求的不同 header ,创建?

react-native - React Native Android GCM(谷歌云消息)

node.js - 提取无法用于上传图像 native