我有下拉菜单,应关闭onSelect项目下拉菜单。
这里是一个名为onSelect
的函数,但认为状态isOpen: false
不会改变,
但是状态部分:selected: option
将被更改。
有人知道为什么吗?
onSelect = (option) => {
this.setState({ selected: option, isOpen: false }, () => {
this.props.onSelect(option);
});
};
这是一个完整的组成部分:
import React from 'react';
import onClickOutside from 'react-onclickoutside';
class SimpleDropdown extends React.Component {
constructor(props) {
super(props);
this.state = {
selected: props.selectValue,
isOpen: false
};
}
toggleDropdown = () => {
// eslint-disable-next-line react/no-access-state-in-setstate
this.setState({ isOpen: true });
};
onSelect = (option) => {
this.setState({ selected: option, isOpen: false }, () => {
this.props.onSelect(option);
});
};
handleClickOutside = () => {
this.setState({ isOpen: false });
};
render() {
const { selected } = this.state;
const { title, isLoading } = this.props;
return (
<div className="simple-dropdown" onClick={this.toggleDropdown} role="button">
<span className="dropdown-title">{title}:</span>
<span>{selected.value}</span>
{this.state.isOpen && !isLoading && (
<ul className="dropdown-ul">
{this.props.options.map((option) => (
<li
key={option.key}
className={`dropdown-option ${option.value === selected.value ? 'hover' : ''}`}
>
<a className="option-btn" onClick={() => this.onSelect(option)} role="button">
{option.value}
</a>
</li>
))}
</ul>
)}
</div>
);
}
}
export default onClickOutside(SimpleDropdown);
答案 0 :(得分:1)
this.toggleDropdown
甚至在选择值时也会被触发,因此添加这样的支票
toggleDropdown = () => {
// eslint-disable-next-line react/no-access-state-in-setstate
if (!this.state.isOpen) {
this.setState({ isOpen: true });
}
};
答案 1 :(得分:1)
这是由Event bubbling
类型的Event propagation引起的。
基本上,子元素上的click事件会触发父元素的click事件。您可以通过在子元素点击处理程序中调用event.stopPropagation()
来解决此问题。
onClick
处理程序下方的通知。处理程序将获取event
对象,然后调用stopPropagation
方法。
<li
key={option.key}
className={`dropdown-option ${option.value === selected.value ? 'hover' : ''}`}
>
<a className="option-btn" onClick={(event) => {event.stopPropagation(); this.onSelect(option)}} role="button">
{option.value}
</a>
</li>