当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)
但是,一旦我使用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)
如果我在此调用中使用现有的全局版本的React(而不是ReactFromAmd,那么它将按预期运行 。jsbin