setState
を呼び出した後にイベントリスナーを追加すると、そのイベントを再度トリガーするとイベントリスナーが呼び出されるだけです。しかし、下の例から、divをクリックすると、状態が変更された後にイベントリスナーが呼び出されます。setStateの後でaddEventListenerを呼び出すと、イベントが2回実行されるようです
私はtoggleOpen
内evt.stopPropagation()
を呼び出す場合、私はaddEventListener
を削除するかどうかは発生しませんが、thte状態が変更された後、私はそれを設定していた場合にイベントリスナーが呼び出さなっている理由私は思ったんだけど。
setState
は状態を非同期に変更しません。これは、イベントが伝播した後にコールバックが呼び出されることを意味しますか?
import React from 'react';
import classNames from 'classnames';
import css from './Dropdown.scss';
export class Dropdown extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
}
}
toggleOpen = (evt) => {
window.removeEventListener('click', this.toggleOpen);
this.setState({
open: !this.state.open,
},() => {
window.addEventListener('click', this.toggleOpen);
});
}
render() {
const dropdownContentClasses = classNames(css.dropdownContent, {
[css.dropdownContent_open]: this.state.open,
});
console.log(this.state.open)
return (
<div className={css.dropdownContainer}>
<div onClick={this.toggleOpen}>
{this.props.title}
</div>
<div className={dropdownContentClasses}>
{this.props.children}
</div>
</div>
)
}
}
私は私の質問に答えるとは思わない。 'prevState'を使うようにsetStateを変更しても問題は解決されません。リスナーを 'componentWillMount'に移動すると、ウィンドウ上の任意のクリックに対してドロップダウンが開きます。私の質問は、状態の更新とイベントの伝播の後にイベントリスナーが追加されても、状態を設定するのと同じクリックでイベントリスナーが呼び出される理由です。 – gzzo