Почему я не могу получить доступ к текущему целевому значению моих двух контейнеров с помощью реакции js на внешний щелчок?
Используя этот https://codedaily.io/tutorials/Create-a-Dropdown-in-React-that-Closes-When-the-Body-is-Clicked, я нашел свое решение, чтобы мое раскрывающееся меню приближалось при нажатии снаружи где-нибудь еще.
Но проблема в том, что у меня есть два похожих компонента раскрывающегося списка, чтобы применить это, поэтому, когда я применил, мой последний раскрывающийся список работал правильно, но не первый. Я не могу понять, почему? может ли кто-нибудь помочь мне в этом.
this.container = React.createRef();
this.state = {
open: false,
};
componentDidMount() {
document.addEventListener("mousedown", this.handleClickOutside);
}
componentWillUnmount() {
document.removeEventListener("mousedown", this.handleClickOutside);
}
handleClickOutside = (event) => {
if (
this.container.current &&
!this.container.current.contains(event.target)
) {
this.setState({
open: false,
});
}
};
и в моем теле div,
<div className="container" ref={this.container}>
{this.state.open && <div>mydropdown1</div>}
</div>
<div className="container" ref={this.container}>
{this.state.open && <div>mydropdown2</div>}
</div>
1 ответ
Вам необходимо учитывать следующие моменты, чтобы выполнить свою работу,
Две отдельные ссылки для двух раскрывающихся контейнеров.
Поддерживать две разные переменные состояния
Необходимо обрабатывать случаи в методах handleClickoutside и handleButtonClick для ссылок и нажатия кнопки соответственно. см. ниже код
container1 = React.createRef(); container2 = React.createRef(); state = { open1: false, open2: false, }; componentDidMount() { document.addEventListener('mousedown', this.handleClickOutside); } componentWillUnmount() { document.removeEventListener('mousedown', this.handleClickOutside); } handleClickOutside = (event) => { if ( this.container1.current && !this.container1.current.contains(event.target) ) { this.setState({open1: false}); } if ( this.container2.current && !this.container2.current.contains(event.target) ) { this.setState({open2: false}); } }; } handleButtonClick = (containerNumber) => { this.setState({[containerNumber]: !this.state[containerNumber]}); }; // your code