gpt4 book ai didi

javascript - 下拉菜单不能在多个地方使用

转载 作者:行者123 更新时间:2023-12-03 03:00:38 24 4
gpt4 key购买 nike

我创建了一个简单的下拉菜单以在我的 react 应用程序中使用。我遇到的问题是下拉菜单仅在一个位置触发,而不是在我想要的位置触发。

例如,假设有 3 个组件,并且我已将下拉菜单包含到所有 3 个组件中。当我单击第二个或第三个组件上的下拉图标时,它始终会打开第一个组件中的下拉菜单。我该如何解决这个问题?

下拉菜单

class DropDown extends Component {

constructor(props) {
super(props);

this.myFunction = this.myFunction.bind(this);

};

myFunction() {
document.getElementById("myDropdown").classList.toggle("show");
}

render() {

window.onclick = function (event) {
if (!event.target.matches('.user_settings_icon')) {

var dropdowns = document.getElementsByClassName("dropdown-content");
var i;
for (i = 0; i < dropdowns.length; i++) {
var openDropdown = dropdowns[i];
if (openDropdown.classList.contains('show')) {
openDropdown.classList.remove('show');
}
}
}
}

return (
<div className="dropdown small_font">
{/*<img src={settings} onClick={this.myFunction} className="user_settings_icon"></img>*/}
<i className="fa fa-cog user_settings_icon" style={{marginTop: '6px'}} onClick={this.myFunction}
aria-hidden="true"></i>
<div id="myDropdown" className="dropdown-content">
{/*<div id="myDropdown" className={this.props.actionDropDownCSS}>*/}
<a className="dropdown_item"><i className="fa fa-trash-o margin_right10px" aria-hidden="true"></i>Delete</a>
<a className="dropdown_item"><i className="fa fa-flag-o margin_right10px" aria-hidden="true"></i>Report</a>
<a className="dropdown_item"><i className="fa fa-minus-square-o margin_right10px"
aria-hidden="true"></i>Unfriend</a>
<a className="dropdown_item"><i className="fa fa-sign-out margin_right10px" aria-hidden="true"></i>Leave
group</a>
</div>
</div>

);
}
}
export default DropDown;

最佳答案

不要使用

document.getElementById("myDropdown").classList.toggle("show")

window.onclick

使用组件 state 来处理下拉列表的切换,并使用 React 的 onClick prop 来附加事件处理程序。

示例

class DropDown extends React.Component {
constructor() {
super()
this.state = {
open: false
}
}
showMenu() {
if(this.state.open) {
return (
<ul>
<li>Add</li>
<li>Delete</li>
</ul>
)
}
}
handleClick() {
this.setState({
open : !this.state.open
})
}
render() {
return (
<div>
<span onClick={this.handleClick.bind(this)}>Menu</span>
{ this.showMenu() }
</div>
)
}
}

class App extends React.Component {
render() {
return (
<div>
<DropDown />
<DropDown />
<DropDown />
</div>
)
}
}

ReactDOM.render(<App/>, document.getElementById('root'));
<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="root"></div>

关于javascript - 下拉菜单不能在多个地方使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47405792/

24 4 0