【问题标题】:Weird bug in react-native ListViewreact-native ListView 中的奇怪错误
【发布时间】:2017-08-10 04:54:10
【问题描述】:

请阅读完整的问题,因为了解这种行为可能会有所帮助。

我有一个包含任务列表的分段 ListView。列表视图包含三个部分(最近、以后和过去)。每个任务都可以有一个用户列表,当任务完成时应该通知这些用户。当一个任务被标记为完成时,它被移动到Past 部分。当一项任务被标记为完成时,会发生以下事情

  1. 在 redux 商店中将任务标记为已完成
  2. 如果任务有参与者,向参与者发送远程通知

当任务被标记为完成时,redux 存储被更新,这会触发ListView 的重新渲染。第二步发生在ListView 根据日志重新渲染之后。

发生的情况是,第二步是由不同任务的道具触发的,而不是被标记为已完成的任务。就好像 ListView 项目被重用了,而之前用于标记为完成的任务的 ListView 项目现在被重用于其他项目,其余代码使用道具运行其他任务很奇怪。下面是它在代码中的样子

  changeTaskStatus = () => {
    this.props.dispatch(ActionCreators.markTaskDone(this.props.id))

    // A re-render is triggered once the above action is dispatched and the
    // this.props.id in the next step is not the one that the user marked as done
    this.props.dispatch(ActionCreators.notifyParticipants(this.props.id))
  }

我将尝试创建一个显示此问题的示例项目。如果您有任何关于此行为的信息,请发表答案或评论。

【问题讨论】:

  • 我想这意味着我需要将所有props 存储在一个对象中并使用该对象来访问数据。它不是很直观,并且有点破坏 javascript 的关闭行为。

标签: react-native redux react-native-listview


【解决方案1】:

您应该使用ListView 绑定数据,如下所示

<ListView ... renderRow={this.renderList.bind(this)} />

所以当更新列表后,您需要将ID 传递给函数changeTaskStatus 并更新ListView。

您也可以创建ID 的单独对象并通过您的自定义逻辑对其进行管理

【讨论】:

  • 我想我不明白你想暗示什么。 “renderRow”方法已经绑定到“this”。当用户单击任务时调用“changeTaskStatus”方法,并且由于将任务标记为已完成而重新呈现任务列表,并且“this”在调用期间指向不同的对象以通知参与者。
  • 我认为当你调用 this.props.dispatch(ActionCreators.notifyParticipants(this.p‌rops.id)) 并传递 this.props.id 可能是你在这里弄错了 ID 所以需要如果您在这里没有得到完美的 id,请在此处检查,然后使用我的解决方案
猜你喜欢
  • 1970-01-01
  • 2020-01-29
  • 2021-06-01
  • 2012-08-12
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多