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

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

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

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

我的架构如下

主页组件代码 - 开始

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组件时,最终产品是这样的。如何关闭其他下拉菜单。

我想知道我的架构是否正确..我没有使用 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; 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!