Для того чтобы два компонента 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
.
АльтернативаReactDOM.render
может использовать только Redux и подключить два несвязанных компонента к одному хранилищу.Они могут общаться через общий магазин.