Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Listview 如何将行前置到react本机列表视图?_Listview_Reactjs_React Native - Fatal编程技术网

Listview 如何将行前置到react本机列表视图?

Listview 如何将行前置到react本机列表视图?,listview,reactjs,react-native,Listview,Reactjs,React Native,我几乎找遍了所有地方,想找到解决办法 是否有一种方法可以在不重新渲染每一行的情况下,将行预先添加到listview?我觉得很奇怪,facebook没有在文档中包含这样做的方法!我觉得好像有一种内存高效的方法可以做到这一点,就像您可以使用本机脚本(java、swift)那样 有很多讨论试图解决这个问题,例如: 但到目前为止,我还没有找到一种有效的方法来实现这一点。没有直接的方法在ListView前面添加行。关于ListView.DataSource的文档并不多。就这样- 如果要从ListView

我几乎找遍了所有地方,想找到解决办法

是否有一种方法可以在不重新渲染每一行的情况下,将行预先添加到
listview
?我觉得很奇怪,
facebook
没有在文档中包含这样做的方法!我觉得好像有一种内存高效的方法可以做到这一点,就像您可以使用本机脚本(java、swift)那样

有很多讨论试图解决这个问题,例如:


但到目前为止,我还没有找到一种有效的方法来实现这一点。

没有直接的方法在ListView前面添加行。关于ListView.DataSource的文档并不多。就这样-

如果要从ListView中添加/追加/前置/更新/删除行,只需更新数据源并在setState中调用cloneWithRows()。

例如,我想从URL获取数据。每次点击“加载更多”,我都会向数据源追加新行

getInitialState: function(){
    return {
        rawData: [],
        dataSource: new ListView.DataSource({
          rowHasChanged: (row1, row2) => row1 !== row2
        }),
        loaded: false,
        page: 1,
    }
},
第一次,我在ComponentDidMount()中调用这个函数,它用初始数据填充我的ListView,并且状态为“page”=1

  reloadData: function(){
    this.setState({ loaded: false, rawData: [], page: 1 });

    API.getUpcomingMovies(this.state.page)
      .then((data) => {
          this.setState({
            rawData: this.state.rawData.concat(data),
            dataSource: this.state.dataSource.cloneWithRows(this.state.rawData.concat(data)),
            loaded: true,
          });
      });
  },
每次我点击“LoadMore”从API获取JSON时,我都会调用以下函数。每当我点击“加载更多”时,“页面”就会增加

如您所见,我正在连接我的rawData[](这是一个包含JSON对象的简单数组)。如果您想在rawData中预先添加新数据,可以执行以下操作-

this.setState({
    rawData: data.concat(this.state.rawData)
)}

嘿,如果我的回答对你有好处的话,请记下我的正确答案!帮助一位程序员同事:)谢谢你的回答!当我这样做时,它会跳上几行。有什么想法可以避免这种情况吗?预加和追加是完全不同的。预渲染时,由于数据源中的数据发生了更改,因此需要进行完整的重新渲染。例如,当您在数据源中有[{id:1},{id:2}]时,现在如果您的前缀为{id:0},则新的数据源是[{id:0},{id:1},{id:2}],正如您所看到的,所有行都已更改,并且会发生完全重新渲染。@ericls您可以通过为行提供唯一的
道具,而不是将数组
索引
(与
映射
函数一起提供的)作为
来避免完全重新渲染。如果要显示问题列表,只需传递
question.id
-
this.setState({
    rawData: data.concat(this.state.rawData)
)}