如何与其他 ReactDOM.render 通信 ReactDOM.render

IT技术 javascript reactjs react-dom
2021-05-21 04:22:30

我有一个包含 React 应用程序和其他 HTML 元素的项目。它的意思是:

ReactDOM.render(<Element1/>, document.getElementById('element1') <some section with HTML /> ReactDOM.render(<Element2/>, document.getElementById('element2')

问题是将一个变量/props/状态从一个 ReactDOM.render 传递到另一个。

我怎样才能做到这一点?

我目前正在使用全局变量window,但更改它后不会刷新第二个 ReactDOM.render 中的数据。

2个回答

为了让两个 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使用setFoosetter通过上下文属性进行通信

可以使用的替代方法ReactDOM.render是使用 Redux 并将两个不相关的组件连接到同一个商店。它们可以通过公共存储进行通信。

您将有多种选择,例如订阅应用程序之间的事件:

// App #1
const event = new Event('start');
// Dispatch the event.
elem.dispatchEvent(event);


// App #2 Listen for the event.
componentDidMount() {
  elem.addEventListener('start', this.start }, false);
}

start = (e) => {
  // ....
}

componentWillUnmount() {
  elem.removeEventListener('start');
}

无论如何,关键是您应该使用像 Redux 这样的全球商店从两个应用程序中挑选您需要的组件,因为这种解决方案非常难以维护。