为了让两个 React 组件单独通过 React 有效地通信,它们应该通过共同的父级进行通信。
如果有两个不相关的小部件,它们可以呈现为具有共同父级的门户,如本答案中所建议的:
<div id="App"></div>
<h2>Foo widget</h2>
<div id="FooWidget"></div>
<h2>Bar widget</h2>
<div id="BarWidget"></div>
class App extends Component {
render() {
state = {
foo: 'foo',
setFoo(foo) {
this.setState(state => ({...state, foo}));
}
};
return <FoobarContext.Provider value={this.state}>
{ReactDOM.createPortal(<FooWidget />, document.getElementById('FooWidget'))}
{ReactDOM.createPortal(<BarWidget />, document.getElementById('BarWidget'))}
</FoobarContext.Provider>;
}
}
const FooWidget = props => <FoobarContext.Consumer>
{({ foo }) => foo}
</FoobarContext.Consumer>;
...
ReactDOM.render(<App />, document.getElementById('App'));
组件可以foo
使用setFoo
setter通过上下文属性进行通信。
可以使用的替代方法ReactDOM.render
是使用 Redux 并将两个不相关的组件连接到同一个商店。它们可以通过公共存储进行通信。