当前位置: 首页 > 面试题库 >

React Native-数据未更改时强制重新渲染ListView

尉迟轶
2023-03-14
问题内容

即使dataSource中的数据未更改,是否也可以强制重新渲染ListView?我的应用程序中的选项卡栏中有一个ListView,我希望每次选择该选项卡时都重新绘制它,而不管数据是相同还是已更改。

this.state = {
  data: props.data,
  dataSource: new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2})
}

componentWillMount() {
  this.setState({
    dataSource: this.state.dataSource.cloneWithRows(nextProps.data)
  })
}

render() {
  <ListView
   dataSource={this.state.data}
   renderRow={this._renderRow}
  />
}

我尝试使用rowHasChanged参数,但这没有帮助。任何帮助将非常感激


问题答案:

因此,据我所知,您的用例是由于value更改而重新呈现ListView的所有行。我不知道是什么value,要由您确定,但是我会用它value来解释我的答案:

有几种解决方法。每个都有优点和缺点:

  • 简单的方法: 只是<ListView key={value} ... />!它告诉React,值更改时,ListView需要重新渲染(它将被卸载,重新安装)。
  • “骇人听闻的方式”。替换为新的数据源。 this.setState({ dataSource: new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 }).cloneWithData(this.props.data) });
  • (imo)最佳实践方式:在数据中,value正确合并并实现rowHasChanged。例如:(r1, r2) => r1.value !== r2.value && r1.data !== r2.data(<-这只是表示数据的一种可能方式,您必须选择格式,我只是假设您确实使用克隆了dataSource nextProps.data.map(data => ({ data, value }))。

对我来说,第三个也是最后一个解决方案是最好的,因为:

  • 它可以很好地缩放以适应更多的重新渲染条件(其他value
  • 可能发生的情况是实际上只应重新渲染部分行,并且在这种情况下,您不应重新渲染所有行以获得更好的性能


 类似资料:
  • 我正在尝试获得一个h:textInput以在更改时重播,我已经用a4j:ajax和f:ajax进行了尝试。 使用a4j:ajax时: 这在面板第一次更新后第一次起作用,它停止更新modell,并且监听器也没有被调用。但是,会触发渲染,从而显示旧值。 现在,当我用f:ajax替换a4j:ajax时,我得到一条错误消息,即在xyzInput中找不到id xyzPG。 当我尝试将重新渲染限制为input

  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 问题内容: 我正在尝试将表示性组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以根据当前用户获取适当的网站。 问题是在最初呈现容器组件之后,异步获取了当前用户。这意味着容器组件不知道它需要重新执行其函数中的代码,该代码将更新数据以发送到。我认为我需要在其props(user)之一更改时重新渲染容器组件。如何正确执行此操作? 问题答案: 您必须在方法中添加条件。 该示例用于比较对象。

  • 基本上,从接收一个单击事件,然后我需要多次更改HTML元素,问题是WebView只显示最后一次更改,这意味着渲染不是立即进行的。 问题:如何制作

  • 我试图将表示组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以基于当前用户获取适当的站点。 问题在于,在容器组件最初呈现之后,当前用户是异步获取的。这意味着容器组件不知道需要在其函数中重新执行代码,该函数将更新数据以发送到。我想当容器组件的一个道具(用户)发生变化时,我需要重新渲染它。如何正确地执行此操作?

  • 问题内容: 我有一些自定义验证代码,其中包括$ formatter。(为了正确起见,我将货币以便士存储,但以磅为便士显示。) 如果用户在输入中键入“ 10”(这是一个有效值),则输入移至下一个字段后,输入仍显示“ 10”。 我希望它显示10.00以保持一致性。 如果模型将值更改为1000,那么格式化程序将使该字段显示为“ 10.00”。 我希望格式化程序在field.blur()上运行(只要输入有