如何将add/Delete项放入ListView?

How to add/Delete item into ListView?

我们可以像这样为 ListView 创建一个数据源

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

但是如果我想从数据源中添加项目或删除项目,我该怎么做呢?我是否需要始终使用更新的数组调用 cloneWithRows?

如果您查看 React Native 教程中扩展的电影示例,它实现了从远程 API 获取新电影的搜索。这意味着每次搜索都会刷新数据存储,有效地添加或删除项目。发生这种情况的确切位置在这里:

getDataSource: function(movies: Array<any>): ListView.DataSource {
    return this.state.dataSource.cloneWithRows(movies);
}

https://github.com/facebook/react-native/blob/master/Examples/Movies/SearchScreen.js#L209

看来你的方法是推荐的方法。

是,致电cloneWithRows(...)

React Native 文档未涵盖 ListViewDataSource 对象,因此阅读 source code 中的评论以了解其工作原理可能会有所帮助。

一些可能有用的注释:

  • cloneWithRows(data) 的命名有点误导,因为它不像名称所暗示的那样只是创建数据的克隆。

  • 相反,它尝试将新的 data 行与数据源中的现有行(如果有)进行比较,并确定是否有要插入的新行或现有行需要更换或移除。

  • 源代码注释指出,数据源中的数据在设计上是不可变的,因此更改它的正确方法是指定更新的数据源,即调用cloneWithRows(...)

仅仅为了更改几行而传递整个列表似乎不直观,但有几个原因可以说明为什么这样做很有意义:

  • 首先,它与 React 的整体 flux-based architecture 一致,其中重点是设置状态并允许组件弄清楚如何改变自身以反映新状态(想想如何 this.propsthis.state 有效)。您可以在 ListView 组件之外随意更改数据数组,但是一旦您准备好更新组件,将整个状态传递到组件中是一种不错的通量方法,因此它可以自行更新。

  • 其次,它相当高效。 ListView在Javascript开始渲染过程之前做了重行区分,然后在期间一次渲染一行(你可以adjust this)渲染周期,以减少丢帧。

  • 第三,这里不排除在未来支持像.addRow(..)这样的方法的可能性。关键是当前的实现是一个不错的开始,因为它提供了一个基于状态的接口,使开发人员不必担心列表组件如何在状态之间发生变化。