我在有菜单按钮的项目中使用react。
<a ref="btn" href="#" className="btn-menu show-on-small"><i></i></a>
还有一个Sidenav组件,例如:
<Sidenav ref="menu" />
我编写了以下代码来切换菜单:
class Header extends React.Component { constructor(props){ super(props); this.toggleSidenav = this.toggleSidenav.bind(this); } render() { return ( <div className="header"> <i className="border hide-on-small-and-down"></i> <div className="container"> <a ref="btn" href="#" className="btn-menu show-on-small"><i></i></a> <Menu className="menu hide-on-small-and-down"/> <Sidenav /> </div> </div> ) } toggleSidenav() { this.refs.btn.classList.toggle('btn-menu-open'); } componentDidMount() { this.refs.btn.addEventListener('click', this.toggleSidenav); } componentWillUnmount() { this.refs.btn.removeEventListener('click', this.toggleSidenav); } }
事实是,这this.refs.sidenav不是DOM元素,我无法在他上添加类。
this.refs.sidenav
有人可以向我解释如何Sidenav像在按钮上一样在组件上切换类吗?
Sidenav
如果您想让React正确高效地渲染DOM,则必须使用组件的State来更新组件参数,例如Class Name。
更新:我更新了示例,以在单击按钮时切换Sidemenu。这不是必需的,但是您可以看到它如何工作。如我所示,您可能需要使用“ this.state”与“ this.props”。我习惯于使用Redux组件。
constructor(props){ super(props); } getInitialState(){ return {"showHideSidenav":"hidden"}; } render() { return ( <div className="header"> <i className="border hide-on-small-and-down"></i> <div className="container"> <a ref="btn" onClick={this.toggleSidenav.bind(this)} href="#" className="btn-menu show-on-small"><i></i></a> <Menu className="menu hide-on-small-and-down"/> <Sidenav className={this.props.showHideSidenav}/> </div> </div> ) } toggleSidenav() { var css = (this.props.showHideSidenav === "hidden") ? "show" : "hidden"; this.setState({"showHideSidenav":css}); }
现在,当您切换状态时,该组件将更新并更改sidenav组件的类名称。您可以使用CSS使用类名称显示/隐藏sidenav。
.hidden { display:none; } .show{ display:block; }