在React中切换类

Hie*_*ero 24 javascript reactjs

我正在使用一个项目,我有一个菜单按钮.

<a ref="btn" href="#" className="btn-menu show-on-small"><i></i></a>
Run Code Online (Sandbox Code Playgroud)

Sidenav组件如:

<Sidenav ref="menu" />
Run Code Online (Sandbox Code Playgroud)

我编写了以下代码来切换菜单:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

事情是,这this.refs.sidenav不是一个DOM元素,我不能在他身上添加一个类.

有人可以解释我如何Sidenav在我的按钮上切换组件上的类吗?

Aar*_*nco 24

如果希望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});
}
Run Code Online (Sandbox Code Playgroud)

现在,当您切换状态时,组件将更新并更改sidenav组件的类名.您可以使用CSS使用类名显示/隐藏sidenav.

.hidden {
   display:none;
}
.show{
   display:block;
}
Run Code Online (Sandbox Code Playgroud)

  • &lt;Sidenav className={this.props.showHideSidenav}/&gt; 为什么不是 this.state.showHideSidenav? (2认同)

Bik*_*kas 13

refs不是DOM元素.为了找到DOM元素,您需要先使用findDOMNodementhod.

做这个

var node = ReactDOM.findDOMNode(this.refs.btn);
node.classList.toggle('btn-menu-open');
Run Code Online (Sandbox Code Playgroud)

或者,您可以这样使用(几乎是实际代码)

this.state.styleCondition = false;


<a ref="btn" href="#" className={styleCondition ? "btn-menu show-on-small" : ""}><i></i></a>
Run Code Online (Sandbox Code Playgroud)

然后,您可以styleCondition根据状态变化条件进行更改.