Javascript 在reactjs中没有父子关系的不同组件之间通信
假设我有两个不同的DOM元素Javascript 在reactjs中没有父子关系的不同组件之间通信,javascript,reactjs,Javascript,Reactjs,假设我有两个不同的DOM元素 <div id="firstDiv"> </div> <div id="secondDiv"> </div> 现在让我们假设我从第一个组件内的服务器获取一些数据,然后我要渲染secondDiv内的部分数据,最好的方法是什么?我可以从第一个组件内调用React.renderComponent(,document.getElementById(“secondDiv”)??如何实现他们之间的双向沟通???假设现在我在第二个
<div id="firstDiv">
</div>
<div id="secondDiv">
</div>
现在让我们假设我从第一个组件内的服务器获取一些数据,然后我要渲染secondDiv内的部分数据,最好的方法是什么?我可以从第一个组件内调用React.renderComponent(,document.getElementById(“secondDiv”)??如何实现他们之间的双向沟通???假设现在我在第二个div中呈现的html中单击一个链接,那么如何更改第一个div中的文本
如果我概括这个问题,它将是“如何从单个组件在多个DOM元素中呈现html,然后在呈现在不同DOM元素中的这些组件之间进行通信?”这可以通过常规方法实现,除非在这种情况下没有任何父级 但是您仍然可以将一些函数传递给根组件,这些函数将在2个组件内调用并触发渲染 下面是您询问的示例的工作演示:
var First = React.createClass({
render: function() {
return <div>Hello1 {this.props.name}</div>;
}
});
var Second = React.createClass({
render: function() {
return <div onClick={this.props.onSecondClicked}>Hello2 {this.props.name}</div>;
}
});
function onSecondClicked() {
React.render(<First name="World updated!" />, document.getElementById("first"));
}
React.render(<First name="World" />, document.getElementById("first"));
React.render(<Second name="World" onSecondClicked={onSecondClicked}/>, document.getElementById("second"));
var First=React.createClass({
render:function(){
返回Hello1{this.props.name};
}
});
var Second=React.createClass({
render:function(){
返回Hello2{this.props.name};
}
});
函数onSecondClicked(){
React.render(,document.getElementById(“第一”));
}
React.render(,document.getElementById(“第一”));
React.render(,document.getElementById(“第二”);
在第二个组件内调用
React.render
应该正常工作(可能在渲染阶段不工作,但无论如何这不是一个好主意)。但是,它在两个组件之间创建了一个巨大的耦合
您还可以创建一个“根组件”,它将是这两个组件的父级
如果有很多组件需要同步,可以使用事件总线进行跨组件通信。此注释太长,无法放入注释中,因此我将其拖到这里 我认为你应该看看Flux架构,Facebook内部使用什么来管理他们的React应用程序,现在它是开源的。在Flux内部,您的案例如下:
- 当呈现(装载)第一个组件时,您将向存储(应用程序/域状态的容器)传递一个操作,以指示存储应首先从服务器提取数据。当数据可用时,存储将发出(更改)事件,即“嘿,我成功获取了数据,您可以来获取它”
- 您的两个组件都已经为存储设置了更改侦听器,因此当存储发出更改事件时,您的组件将通过调用存储上的getter(例如
)来请求新数据。您的两个组件都只呈现它们感兴趣的那部分数据getState()
- 当在
中发生一个动作(比如onClick)来改变应用程序的状态时,该动作(web API事件)将触发一个Flux动作(一个普通的旧JS助手方法),该动作将在修改状态的存储中结束。(链条中有一个调度员,我现在不想说的还有其他调度员)secondComponent
- 商店会将其初始状态更改为新状态,例如从
更改为Hello World
Hello,World!我已更新
- 状态更改后,存储再次发出更改事件,第一个组件相应地更新其状态
- 商店会将其初始状态更改为新状态,例如从
publishEvent
方法和侦听器数组的对象。您还可以使用开源和更高级的js总线,就像您的所有“根组件”都应该侦听事件总线并根据事件更改其反应状态一样,使用道具将此状态传播给他们的孩子。谢谢,将查看FLUX!也许对于这个简单的例子来说,Flux和Flux的样板文件似乎有点开销,但是当你的应用程序变得越来越大,变得越来越复杂时,Flux和单向数据流就会发光。
var First = React.createClass({
render: function() {
return <div>Hello1 {this.props.name}</div>;
}
});
var Second = React.createClass({
render: function() {
return <div onClick={this.props.onSecondClicked}>Hello2 {this.props.name}</div>;
}
});
function onSecondClicked() {
React.render(<First name="World updated!" />, document.getElementById("first"));
}
React.render(<First name="World" />, document.getElementById("first"));
React.render(<Second name="World" onSecondClicked={onSecondClicked}/>, document.getElementById("second"));