Global React在AMD React中表现不佳

sen*_*ett 5 amd reactjs

React页面上已经存在全局变量时,使用AMD加载的React渲染组件时,我得到了奇怪的怪异行为。组件上的点击事件在不应该触发时会被触发。

对DOM的观察表明,这是由于多个React实例(一个全局实例,在我的情况下是一个AMD)彼此不了解而引起的,但这在依赖于React的运行时将AMD模块加载到页面中时会出现问题还包括React。

我该如何解决这种冲突?

再生产

我可以制作一个像这样的组件:

var ButtonComponent = React.createClass({
  onButtonClick: function(){
    alert(this.props.data + ' click event fired');
  },
  render: function() {
    return React.DOM.button({onClick: this.onButtonClick}, this.props.data);
  }
});

(function(){ // create vanilla

  var ButtonList = React.createClass({
    render: function() {
      return React.DOM.div({}, React.createElement(ButtonComponent, {data: this.props.data}));
    }
  });

  React.render(React.createElement(ButtonList, {data: 'button that was loaded by the page'}), document.getElementById('page-load-target'));

})();
Run Code Online (Sandbox Code Playgroud)

jsbin

但是,一旦我使用React的另一个实例添加另一个组件,然后单击第一个按钮,然后它将在第二个加载的按钮上调用click事件:

// .... as above ....

(function(){ // create using amd

  require.config({
    paths: {
      'react': '//fb.me/react-with-addons-0.12.2.min'
    }
  });

  window.setTimeout(function(){ 
    require(['react'], function(ReactFromAmd){ 
      ReactFromAmd.render(ReactFromAmd.createElement(ButtonComponent, {data: 'button that was loaded by AMD'}), document.getElementById('amd-load-target'));
    });
  }, 1000)

})();
Run Code Online (Sandbox Code Playgroud)

jsbin

如果我在此调用中使用现有的全局版本的React(而不是ReactFromAmd,那么它将按预期运行 。jsbin