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

如何在两个React组件之间建立共享状态?

郭均
2023-03-14
问题内容

我有2个需要共享状态的React组件,react-
router显示了组件A,该组件接受一些输入并将其添加到其状态,在状态成功更新后,我想重定向到组件B,用户在其中添加在我向我的api提交发布请求以保存来自组件A和B的数据之前,使用一些更多的输入并更新与组件A相同的状态以使用来自A和B的输入来构建对象。如何做到这一点,使用react-
router的方式,还是我必须在组件之间设置父/子关系?


问题答案:

您想要实现一个存储状态的对象,可以使用回调函数对其进行修改。然后,您可以将这些函数传递给React组件。

例如,您可以创建一个商店:

function Store(initialState = {}) {
  this.state = initialState;
}
Store.prototype.mergeState = function(partialState) {
  Object.assign(this.state, partialState);
};

var myStore = new Store();

ReactDOM.render(
  <FirstComponent mergeState={myStore.mergeState.bind(myStore)} />,
  firstElement
  );
ReactDOM.render(
  <SecondComponent mergeState={myStore.mergeState.bind(myStore)} />,
  secondElement
  );

现在,FirstComponentSecondComponent实例都可以调用this.props.mergeState({ . . .})以将状态分配给同一存储。

Store.prototype.getState作为练习留给读者。

请注意,您始终可以将store(myStore)本身传递给组件;这样做反而会减少反应。

以下是一些您可能会感兴趣的文档:

React Docs:“组件之间通信”

要在没有父子关系的两个组件之间进行通信,可以设置自己的全局事件系统。订阅componentDidMount()中的事件,取消订阅componentWillUnmount()中的事件,并在收到事件时调用setState()。助焊剂模式是解决此问题的一种可能方法。



 类似资料:
  • 问题内容: 我正在开发使用Meteor和React作为视图引擎的应用程序 考虑下图: 从另一个示例反应隐藏组件 当触发C4按钮单击事件时,我需要更改C2组件状态。由于他们没有直接关系,因此我无法直接从C4进入C2状态。 另一个示例是从Component提交表单并获取在另一个Component中声明的数据(输入字段的值)。 我知道可以通过一些技巧来解决此问题(例如,流星会话,通过每个组件传递数据,基

  • 我有一组组件呈现同一页面的不同部分。只要在其中一个内部提交操作,就应该锁定其他的操作(应该通过它们传播一个volatile标志,并触发一个禁用所有元素的javascript函数) 页面组件: 有什么想法吗?我是新手,任何提示都会有帮助。

  • 问题内容: 我在JVM(Scala)中构建了一个庞大的图形,我想反复使用它来调整算法。我不想每次都从磁盘重新加载它。有没有办法让它坐在一个JVM中,而又与另一个正在开发算法的JVM连接呢? 问题答案: 将图形保存到磁盘,然后使用MappedByteBuffer将其映射到内存。两个进程应使用相同的内存,该内存将与页面缓存共享。

  • 一周前,我开始建立一个WooCommerce商店,它应该可以选择在两个客户之间共享订单。这是我为您制作的一个小图表,您可以理解它应该是什么样子(请看一看): 这就是我一步一步做的 用户B单击一个按钮- 用户B单击另一个按钮- 这两个步骤(显示和隐藏用户B的订单)工作正常——我已经测试过了。字段设置和取消设置。 现在情况越来越糟: 我已经搜索了很多,并要求一些人找到WooCommerce中的功能,该

  • 问题内容: 我需要在两个(或更多个)组合框之间共享数据,但是我想独立选择元素。例如,如果我在第一个comboBox中选择Object1,则我的第二个ComboBox也选择Object1,因为它们具有相同的模型(DefaultComboBoxModel,并且此模型还管理所选的对象)。但是我不想要这种行为。我想在我的comboBoxes中独立选择对象。当我在第一个comboBox中选择对象时,我的第二

  • 我有两个war文件,比如war1和war2 如果am登录应用程序,会话将在war1中创建,如果am导航到war2,我需要相同的会话数据。 我在服务器的context.xml尝试了Cross Context=true,我可以通过将数据存储在servletContext中来访问数据。但问题是一旦我在chrome中登录屏幕,会话数据将存储在servletContext中,数据将保持到应用程序运行。 如果