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

强制React容器刷新数据

西门京
2023-03-14
问题内容

在我的React应用程序中,我有两种不同类型的组件: 演示文稿容器 。大约是Dan Abromov的“ Presentational and
Container Components”之后
,除了我不使用Flux或Redux。

现在,我具有以下结构:

UsersContainer
├── UsersListContainer
|   └── UsersListView
└── AddUserContainer

UsersListContainer负责从一些REST API加载数据,如果成功的话,代表们提交的数据的UsersListView

AddUserContainer负责添加新用户,再通过调用一个REST
API。现在,当成功完成后,我想UsersListContainer刷新其数据。

我能想到的最好的是:

class AddUserContainer extends React.Component {
  render() {
    // Other UI elements omitted for brevity
    return (<button onClick={ e => props.onUserAdded() }>Add user</button>);
  }
}

class UsersListContainer extends React.Component {
  componentWillMount() {
    // start fetching data using window.fetch;
    // the promise callback will but retrieved data into this.state
  }
  render() {
    return (<table></table>);
  }
}

class UsersContainer extends React.Component {
  render() {
    const forceUpdate = this.setState({ ...this.state, refreshToken: Math.random() });
    // Other UI elements omitted for brevity
    <UsersListContainer key={ this.state.refreshToken } />
    <AddUserContainer onUserAdded={ forceUpdate } />
  }
}

但是这种方法就像在key滥用道具。有没有更好/更优雅的方式来做到这一点?


问题答案:

如果您还不想使用Flux或Redux,那么更新对等组件(在您的情况下为UsersListContainer和AddUserContainer)在我看来是React的反模式。

对我来说,React的主要思想是将道具从父母传递给孩子,因此,欧文·林(Irvin
Lim)的思想“摆脱了UsersListContainer,但将AddUserContainer移至UsersContainer”将使您更容易控制何时更新组件!

您当前的处理方法和我的想法是相同的:在 UsersContainer中 ,创建一个方法来强制对其进行更新,然后将其传递给
AddUserContainer ,并在此AddUserContainer添加用户之后,在父级上触发该更新方法:

<AddUserContainer onUserAdded={ this.props.updatingParent } />

供您参考,或者对于想要了解在子代(或孙代或曾孙或曾孙)更新时如何更新父组件的任何其他人,请参考我对另一个类似问题的回答:

重定向时重新初始化类

如果仍然保留当前的组件层次结构,则在更新 UsersContainer 时,其子组件( UsersListContainer
AddUserContainer )也将被更新。但是, AddUserContainer 将再次被更新!

因此,我仍然认为在您的情况下,使用Flux或Redux是一种不错的方法,它消除了将道具通过许多层次的复杂组件层次结构传递的复杂性



 类似资料:
  • 问题内容: 是否有可能迫使浏览器刷新缓存的CSS? 这并不是每个请求都那么简单。我们有一个站点已有一段时间稳定的CSS。 现在,我们需要对CSS进行一些重大更新;但是,已缓存CSS的浏览器将在两天内不会收到新CSS,从而导致呈现问题。 有没有一种方法可以强制刷新CSS,还是最好选择特定于版本的CSS URL? 问题答案: 有几件事情需要考虑,有多种方法可以解决。首先,规格 我们要完成什么? 理想情

  • 问题内容: 我正在通过XAMPP开发基于Wordpress源代码的网站。有时,我更改了CSS代码,脚本或其他内容,但我注意到我的浏览器需要花费一些时间来应用修改。这导致我使用多个浏览器刷新一个浏览器,如果不应用新样式,则尝试第二个浏览器,而且总是这样。 有什么办法可以避免这个问题?有时我在更改代码时没有注意到先前的修改。 问题答案: 一般解决方案按Ctrl+ F5(或Ctrl+ Shift+ R)

  • 问题内容: 我将SEAM与JPA(实现为Seam托管持久性上下文)一起使用,在后备bean中,我将一组实体(ArrayList)加载到后备bean中。 如果不同的用户修改了另一个会话中的实体之一,而我希望将这些更改传播到会话中的集合中,则我有一种方法并尝试了以下方法… 用以下查询 重新执行查询,这只会返回我已经拥有的相同数据(我假设它正在使用一级缓存而不是访问数据库) 调用,这应该从数据库刷新,但

  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个

  • 我将Seam与JPA一起使用(实现为SEAM管理的持久上下文),在我的后台bean中,我将一个实体集合(ArrayList)加载到后台bean中。 如果不同的用户在不同的会话中修改实体之一,我希望这些更改传播到我的会话中的集合,我有一个方法< code>refreshList()并尝试了以下方法... 使用以下查询 重新执行查询,只返回我已经拥有的相同数据(我假设它使用的是一级缓存,而不是数据库)

  • 我有一个docker compose文件,看起来像: 运行之后,我看到所有的服务都启动了,并且看起来工作良好。我的服务使用以下sqlalchemy连接字符串连接到postgres: 每当我终止组合(使用或)然后重新启动它时,postgres中的数据似乎会持续存在。我相信它持续存在的原因是因为我的webserver从上一个会话的数据开始。 我阅读了postgres docker映像的文档,并找到了环