在 React 中的组件之间共享数据
Sharing data between components in React
我正在开发一个使用 Meteor 和 React 作为视图引擎的应用程序
考虑这张图:
React hide component from another example
我需要在触发 C4 按钮单击事件时更改 C2 组件状态。
由于他们没有直接关系,我无法直接从 C4 访问 C2 状态。
另一个例子是从组件提交表单并获取在另一个组件中声明的数据(输入字段的值)。
我知道有一些可能的技巧可以解决这个问题
(例如 Meteor Session,通过每个组件传递数据,基于通量 Action/Dispatcher)。
React 文档推荐使用 event/subscribe 系统(flux 是一种可能的解决方案,但 flux 远不止于此...)Communicate Between Components
Redux 是另一种可能性(我有点担心,对于大型应用程序,如果我有很多操作,组合的 reducers 函数会爆炸,而且还担心缺少特定于操作的订阅系统——据我所知,所有的监听器都会在发送一个动作时被执行——我是 redux 的新手,也许我错了)
Flux 或 Redux 是有效的模式,可以满足比我更大的需求,我已经拥有 Meteor 来完成这类工作。
我唯一需要的是访问另一个内部的组件状态...
我需要针对 medium/large 具有大量组件视图的应用程序的可扩展解决方案
解决该问题的 "right" 方法是什么?
更新:
最近我给了 redux 一个机会,它似乎完成了工作(它真的很棒并且得到了很好的支持),所以如果你遇到同样的情况,请检查
您可以使用任何 publish/subscribe 事件库,然后让您的组件侦听您需要的任何事件。
例如:
import React from 'react'
import 'events' from 'eventPublishSubscribeLibrary'
class Component2 extends React.Component {
constructor (props) {
super(props)
this.toggleVisibility = this.toogleVisibility.bind(this)
this.state = {
visible = true
}
}
componentDidMount () {
events.subscribe('clicked-button', this.toogleVisibility)
}
toogleVisibility () {
this.setState({
visible: !this.state.visible
})
}
render () {
return visible && (
<div>content</div>
)
}
}
const Component4 = () => (
<button onClick={events.publish('clicked-button')}>Toggle Visibility</button>
)
您可以在 davidwalsh 的 post 中找到其他库的 Pub/Sub JavaScript Object. Or you can search in npm 的简单实现。
"right"方式
这是我能想到的最简单的实现方式,对于小型项目来说,这是一个应该可行的快速简单的解决方案。
无论如何,只要项目稍有增长,您的组件之间就会开始有很多 actions/reactions。随着您添加的每个新组件,跟踪所有组件之间的所有这些 关系 会变得更加复杂。这是将应用程序的 global 状态存储在一个地方很方便的地方,这是 redux 所基于的 three principles 之一: 单一事实来源。
我认为现在是您向应用程序引入一些状态的最佳时机。试试Redux,太棒了
我正在开发一个使用 Meteor 和 React 作为视图引擎的应用程序
考虑这张图:
React hide component from another example
我需要在触发 C4 按钮单击事件时更改 C2 组件状态。 由于他们没有直接关系,我无法直接从 C4 访问 C2 状态。
另一个例子是从组件提交表单并获取在另一个组件中声明的数据(输入字段的值)。
我知道有一些可能的技巧可以解决这个问题 (例如 Meteor Session,通过每个组件传递数据,基于通量 Action/Dispatcher)。
React 文档推荐使用 event/subscribe 系统(flux 是一种可能的解决方案,但 flux 远不止于此...)Communicate Between Components
Redux 是另一种可能性(我有点担心,对于大型应用程序,如果我有很多操作,组合的 reducers 函数会爆炸,而且还担心缺少特定于操作的订阅系统——据我所知,所有的监听器都会在发送一个动作时被执行——我是 redux 的新手,也许我错了)
Flux 或 Redux 是有效的模式,可以满足比我更大的需求,我已经拥有 Meteor 来完成这类工作。 我唯一需要的是访问另一个内部的组件状态...
我需要针对 medium/large 具有大量组件视图的应用程序的可扩展解决方案
解决该问题的 "right" 方法是什么?
更新:
最近我给了 redux 一个机会,它似乎完成了工作(它真的很棒并且得到了很好的支持),所以如果你遇到同样的情况,请检查
您可以使用任何 publish/subscribe 事件库,然后让您的组件侦听您需要的任何事件。
例如:
import React from 'react'
import 'events' from 'eventPublishSubscribeLibrary'
class Component2 extends React.Component {
constructor (props) {
super(props)
this.toggleVisibility = this.toogleVisibility.bind(this)
this.state = {
visible = true
}
}
componentDidMount () {
events.subscribe('clicked-button', this.toogleVisibility)
}
toogleVisibility () {
this.setState({
visible: !this.state.visible
})
}
render () {
return visible && (
<div>content</div>
)
}
}
const Component4 = () => (
<button onClick={events.publish('clicked-button')}>Toggle Visibility</button>
)
您可以在 davidwalsh 的 post 中找到其他库的 Pub/Sub JavaScript Object. Or you can search in npm 的简单实现。
"right"方式
这是我能想到的最简单的实现方式,对于小型项目来说,这是一个应该可行的快速简单的解决方案。
无论如何,只要项目稍有增长,您的组件之间就会开始有很多 actions/reactions。随着您添加的每个新组件,跟踪所有组件之间的所有这些 关系 会变得更加复杂。这是将应用程序的 global 状态存储在一个地方很方便的地方,这是 redux 所基于的 three principles 之一: 单一事实来源。
我认为现在是您向应用程序引入一些状态的最佳时机。试试Redux,太棒了