luk*_*k_z 2 javascript events flux reactjs redux
我正在开发使用Meteor和React作为视图引擎的应用程序
考虑下图:
当触发C4按钮单击事件时,我需要更改C2组件状态。由于他们没有直接关系,因此我无法直接从C4进入C2状态。
另一个示例是从Component提交表单并获取在另一个Component中声明的数据(输入字段的值)。
我知道可以通过一些技巧来解决此问题(例如,流星会话,通过每个组件传递数据,基于流量的Action / Dispatcher)。
React docs建议使用事件/订阅系统(通量是一种可能的解决方案,但通量不止此...)在组件之间进行通信
Redux是另一种可能性(对于一个大型应用程序,如果我有很多动作,我会有些担心,因为组合减速器功能会爆炸,而且对于没有动作专用的订阅系统,到目前为止)我知道在调度操作时将执行所有侦听器-我是redux的新手,也许我错了)
Flux或Redux是有效的模式,可以满足比我更大的需求,我已经有过Meteor这样的工作。我唯一需要的是访问另一个内部的组件状态。
我需要具有大量组件视图的中型/大型应用程序的可伸缩解决方案
解决该问题的“正确”方法是什么?
更新:
最近我给了redux一个机会,它似乎可以完成工作(它确实很棒并且得到了很好的支持),因此,如果您在相同的情况下,请检查React + Redux:提交多组件表单
您可以使用任何发布/订阅事件库,然后使您的组件侦听所需的任何事件。
例如:
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>
)
Run Code Online (Sandbox Code Playgroud)
您可以在davidwalsh的这篇文章中找到Pub / Sub JavaScript Object的简单实现。或者,您可以在npm中搜索其他库。
这是我能想到的最简单的实现,对于小型项目,这是一个应该可行的快速简单的解决方案。
无论如何,就项目的增长而言,您将在组件之间开始有很多动作/反应。随着每个新组件的添加,跟踪所有组件之间的所有这些关系将变得更加复杂。这是将应用程序的全局状态存储在一个地方很方便的地方,这是redux基于的三个原则之一:单一真相。