当前位置: 首页 > 知识库问答 >
问题:

React-native ListView数据源未更新

董建茗
2023-03-14
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});

var ReviewList = React.createClass({
  _getMovieReviews: function() {
    var _urlForReview = this.props.config.api_url + 'movies/' + 
    this.props.movie.id + '/reviews.json?apikey=' + this.props.config.api_key;
            this.setState(function(){
          dataSource: ds.cloneWithRows(['before fetch']);  
        });
    fetch(_urlForReview)
      .then(function(res) {
        return res.json();
      }).then(function (json){
        console.log(json);
        this.setState(function(){
          dataSource: ds.cloneWithRows(['fetch done']);  
        });
    });
  }, 
  getInitialState: function() {
    return {
      dataSource: ds.cloneWithRows(['initial'])
    };
  },
  componentDidMount: function() {
      this._getMovieReviews();
  },

render: function() {
  return (
     {rowData}}
    />
  );
}
});

update问题似乎在于从fetch语句中更新数据源。

共有1个答案

牛经赋
2023-03-14

您需要设置它,以便在ComponentDidMount上重置数据源:

  getInitialState: function() {
    return {
      dataSource: ds.cloneWithRows([])
    };
  },

  componentDidMount: function() {
        this._getMovieReviews()  
  },

  _getMovieReviews: function() {
    // Go to api and get movies, then...
    this.setState({
        dataSource: ds.cloneWithRows(movieReviewsFromApi)
    })
  },

如果这回答了你的问题,请告诉我。我在这里建立了一个完整的工作项目。代码也在下面。

https://rnplay.org/apps/p-em5q

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  ListView,
} = React;

var movieReviewsFromApi = [
  {name: 'Die Hard', review: 'Best movie ever'}, {name: 'Home Alone 2', review: 'Great movie'}, {name: 'Bourne Identity', review: 'Awesome Movie'}
  ]

var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});

var SampleApp = React.createClass({

  getInitialState: function() {
    return {
      dataSource: ds.cloneWithRows([])
    };
  },

  componentDidMount: function() {
        this._getMovieReviews()  
  },

  _getMovieReviews: function() {
    this.setState({
        dataSource: ds.cloneWithRows(movieReviewsFromApi)
    })
  },

  _renderRow: function(rowData) {
    return (<View style={{height:70,borderBottomColor: '#ededed', borderBottomWidth:1, paddingLeft:10, paddingTop:10}}>
                <Text style={{fontSize:22}}>{rowData.name}</Text>
              <Text style={{color: '#666'}}>{rowData.review}</Text>
            </View> )
  },

  render: function() {
    return (
    <View style={{ marginTop:60 }}>
        <ListView
      dataSource={this.state.dataSource}
      renderRow={this._renderRow}
    />
    </View>
  );
  }
});

AppRegistry.registerComponent('SampleApp', () => SampleApp);
 类似资料:
  • 问题内容: 即使dataSource中的数据未更改,是否也可以强制重新渲染ListView?我的应用程序中的选项卡栏中有一个ListView,我希望每次选择该选项卡时都重新绘制它,而不管数据是相同还是已更改。 我尝试使用参数,但这没有帮助。任何帮助将非常感激 问题答案: 因此,据我所知,您的用例是由于更改而重新呈现ListView的所有行。我不知道是什么,要由您确定,但是我会用它来解释我的答案:

  • 问题内容: 我正在尝试在Jetty 7.4中配置数据源。我可以使用Tomcat context.xml中的Web应用程序成功完成此操作。 这就是我在jetty.xml中的内容(这将是该码头实例中的唯一应用程序,因此我不介意在服务器范围内使用数据库连接-我宁愿不必在战争中进行配置) 。它位于最后一个上方的最底部: 在我的Web应用程序的WEB-INF / web.xml中: 最后,在我的hibern

  • 问题内容: 有没有一种方法可以使用更多最新数据来更新发送到通道的未读数据? 我有一个goroutine(生产者),其频道提供了对另一个goroutine(消费者)的进度更新。在某些情况下,进度可以比消费者使用更新消息快得多。 这给我带来了问题,因为我可以: 阻止将数据发送到通道。这意味着,如果使用者读取数据的速度较慢,则进度更新goroutine会完全阻塞-不应这样做。 频道已满时,请勿阻止发送并

  • 我的xhtml中有下一个结构 方法searchAnimals()可以,它返回动物项,但dataTable不刷新,但在java代码(managedBean)中,ArrayList包含这些项。我能做什么?谢谢编辑:我正确地使用了de h:和p:后缀(我想是的),代码是完整代码的一部分,但它是无法正确工作的片段。在第一个面板中,我有一个过滤器控件(按类别、按日期等),命令按钮的功能是调用一个在数据库上执

  • 我使用RecycerView使用游标显示sqlite数据库中的数据,当我从数据库中删除一项时,该项将被删除,但我的RecycerView视图不会刷新。 我必须回到我的主要活动,然后数据被刷新。我已经使用了notifyItemRemoved()和notifyDataSetChanged()

  • 问题内容: 我有一个Spring应用程序,我想动态更改数据源。当输入DS URL时,Spring Bean和所有依赖项将自动更新。我知道这有些奇怪,但是无论如何我都想实现。我的Spring配置如下: 问题是: JDBC URL存储在属性中,可以在运行时更改它。 更改URL后,我需要重新创建数据源,可能还需要重新创建相关对象。我不知道Spring如何优雅地做呢? 我知道Spring确实可以基于一个键