gpt4 book ai didi

reactjs - ReactJS 中的 Bootstrap 下拉菜单,一次只能打开一个

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

我有一个页面包含多个引导卡,每个卡都是一个组件,每个卡页脚也是一个组件。卡片页脚包含按钮。当您点击按钮时,下拉菜单将打开,如下所示

enter image description here

在任何时候,当我单击按钮时,其他下拉菜单都应处于关闭状态。但事情却是这样发生的……

enter image description here

要求:还有一件事是,当我单击同一按钮时,应关闭相应的下拉菜单。

要求:当我单击下拉列表中的任何项目时,相应的下拉列表应关闭

我的架构如下

enter image description here

主页组件代码 - 开始

class HomePage extends React.Component {
constructor(props) {
super(props);
this.state = {
items: [],
activatedIdStoredInParent: ""
};
}
toggleCountersMenu = (name) => {
var name1 = name;
this.setState((prevState) => {
return {
activatedIdStoredInParent: name1
}
});
}

render() {

const products = this.state.items.map((item, index) => {
return <div>
<Card
product={item}
activatedIdStoredInParent={this.state.activatedIdStoredInParent}
toggleCountersMenu={this.toggleCountersMenu}
>
</Card>;
</div>
});

return (
<div>
<div className="card-columns">
{products}
</div>
</div >
);
}
}

export default HomePage;

主页组件代码 - END

卡组件代码 - 开始

class Card extends React.Component {
handleActionClick = (name) => {
this.props.toggleCountersMenu(name);
}
render() {
return (
<div key={this.props.product.name}>
<CardHeader product={this.props.product} />
<CardBody product={this.props.product} />
<CardFooter
product={this.props.product}
onActionItemClick={this.handleActionClick}
activatedIdStoredInParent={this.props.activatedIdStoredInParent}
/>
</div>
);
}
}

export default Card;

卡页脚组件代码 - 开始

class CardFooter extends React.Component {

handleActionItemClick = (name) => {
this.props.onActionItemClick(name);
}

render() {
console.log('Card Footer Drop Down comp rendered');
return (
<div className=" card-footer text-center">
<ButtonDropdown text="F" className="danger"
product={this.props.product}
onActionItemClick={this.handleActionItemClick}
activatedIdStoredInParent={this.props.activatedIdStoredInParent}
></ButtonDropdown>
</div>
);
}
}

export default CardFooter;

ButtonDropdown 组件代码 - 开始

class ButtonDropdown extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
show: ' none',
localActivatedId: 'none'
}
}
toggleOpen = (e) => {
var name = e.target.name;

this.setState((prevState, props) => {
var item = {
localActivatedId: name
}
if (props.activatedIdStoredInParent === name) {
if (prevState.show === ' show') {
item.show = ' none';
}
else {
item.show = ' show';
}
}
return item;
});
this.props.onActionItemClick(name);
}

numberClick = (e) => {
var qty = e.target.innerText;
this.setState((prevState, props) => {
var item = {
show: ' none'
}
return item;
});
}
render() {
return (
<div className="btn-group" >
<button type="button" className={`btn btn-${this.props.className} mr-1`} name={this.props.product.name + '$$' + this.props.text} onClick={this.toggleOpen}>
{this.props.text} (classAdded={this.state.show})
</button>

<div className={`dropdown-menu ${this.state.show}`}>
<span className="dropdown-item cursor-pointer " onClick={this.numberClick}>
-1
</span>
<span className="dropdown-item cursor-pointer" onClick={this.numberClick}>
-2
</span>
</div>
</div>



);
}
}

export default ButtonDropdown;

当我在卡页脚中添加多个buttonDropdown组件时,最终产品是这样的。如何关闭其他下拉菜单。

enter image description here

我想知道我的架构是否正确..我没有使用 Redux/Flux 等..

最佳答案

您可以使用 componentDidUpdate 生命周期来更新打开下拉列表的状态属性。我不知道是 open 还是 show 属性显示下拉列表的内容,但这是我的逻辑。

class ButtonDropdown extends React.Component {
constructor(props) {
super(props);
this.state = {
//
};
}

componentDidUpdate(prevProps) {
const name = this.props.product.name + '$$' + this.props.text;

if (prevProps.activatedIdStoredInParent !== this.props.activatedIdStoredInParent && this.props.activatedIdStoredInParent !== name) {
this.closeDropDown();
}
}

closeDropDown = () => this.setState({ isOpen: false });

toggleOpen = (e) => {
//
}

numberClick = (e) => {
//
}

render() {
//
}
}

export default ButtonDropdown;

关于reactjs - ReactJS 中的 Bootstrap 下拉菜单,一次只能打开一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52587774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com