ドキュメント全体のクリックをリッスンしてコンポーネントをビルドし、IE11の問題が発生しました。IE11で削除された後にイベントリスナー関数が呼び出されました
この問題を再現するためのシンプルなコンポーネントをいくつか書きました。
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
show: false
}
}
render() {
return (
<div>
<button
onClick={() => this.setState({
show: !this.state.show
})}
>
Toggle
</button>
<div>
{this.state.show && (
<Component />
)}
</div>
</div>
)
}
}
class Component extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
componentDidMount() {
console.log('listener added')
document.addEventListener('click', this.handleClick)
}
componentWillUnmount() {
console.log('listener removed')
document.removeEventListener('click', this.handleClick)
}
handleClick() {
console.log('clicked!');
const node = ReactDOM.findDOMNode(this);
}
render() {
return <div>Component</div>
}
}
ReactDOM.render(
<App /> ,
document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>
ので、Component
コンポーネントは、文書化し、リスナーをクリックして追加し、App
部品は取り付けとComponent
をアンマウントの世話をします。
Component
がマウントされ、イベントリスナーが適用され、アンマウントされたリスナーが削除されると、ChromeとFirefoxですべて機能します。
ただし、IE11では、リスナーが削除されても、ハンドラ関数は引き続き呼び出され、アンマウントされたコンポーネントのfindDOMNode
を試してエラーがスローされます。これは大きな問題ではないかもしれませんが、まだ私にはバグがあり、回避策があるかどうかを知りたいと思います。また
、ノート - event.stopPropagation
経由停止伝播私のアプリでComponent
は、多くの方法でアンマウントすることができますので、ボタンのクリックは一例
JSFiddle reproducing the issue