ラップされたコンポーネントの外にあるクリックをリッスンするためにHOCを作成しました。Reactjs - 高次コンポーネントのアンマウントが正しく機能しない
HOCは、次のようになります。
const addOutsideClickListener = (WrappedComponent) => {
class wrapperComponent extends React.Component {
componentDidMount() {
console.log('*** component did MOUNT called ***');
document.addEventListener('click', this._handleClickOutside.bind(this), true);
}
componentWillUnmount() {
console.log('*** component will UNMOUNT called ***');
document.removeEventListener('click', this._handleClickOutside.bind(this), true);
}
_handleClickOutside(e) {
const domNode = ReactDOM.findDOMNode(this);
if ((!domNode || !domNode.contains(e.target))) {
this.wrapped.handleClickOutside();
}
}
render() {
return (
<WrappedComponent
ref={(wrapped) => { this.wrapped = wrapped }}
{...this.props}
/>
);
}
}
return wrapperComponent;
}
それは...ほとんどの時間を正常に動作します。
包まれたコンポーネントがアンマウントされる場合には、メソッド「componentWillUnmount」は呼び出されるが、「にremoveEventListenerは」イベントをリッスンし続け、私はエラーメッセージが 得る「不明なエラー:。findDOMNodeをアンマウントコンポーネントで呼び出されました」
何が原因なのでしょうか?
は、この参照してください。あなたは、 "バインド" を使用する場合https://gist.github.com/Restuta/e400a555ba24daa396ccを新しい関数の参照は、技術的には異なる関数を削除しようとしています – Jayce444
ありがとう!この変更は新しい問題を生み出します - 私は今どこでもクリックするたびにこのエラーを受け取ります。 "キャッチされていないエラー:要素はReactComponentでもDOMNodeでもないようです" – Petrov
ここで正しい答えが得られるように新しい質問を投稿しました。 http://stackoverflow.com/questions/41740360/reactjs-higher-order-component-unmount-not-working-correctly-part-2を参照してください – Petrov