State Change Not Rerendering 组件概念问题

State Change Not Rerendering Component Conceptual Question

我有以下Javascript代码

class Navbar extends React.Component {
    constructor(props) {
        super(props);
        this.state = {isVisible: false};
    }
    render() {
        console.log('hi')
        return(
            <div className = 'navbar'>
                <div className = 'nav-button'
                    onClick = {() => this.setState({isVisible: !this.state.isVisible})}>
                </div>
           
                    <div className = 'navbar-content row'>
                        <div className="navbar-item col s1 offset-s6"><h5 className="center-align">Home</h5></div>
                        <div className="navbar-item col s1"><h5 className="center-align">About</h5></div>
                        <div className="navbar-item col s1"><h5 className="center-align">Home</h5></div>
                        <div className="navbar-item col s1"><h5 className="center-align">About</h5></div>
                    </div>
            </div>
        );
    }
}

当我单击“导航按钮”时,我应该调用 setState 来更改 isVisible 组件,因此该组件应该重新呈现并且我应该期望控制台记录 'hi'。然而,这并没有发生。我想知道为什么组件没有重新渲染。

但是,当我删除导航栏正下方的 div 标记时,组件会成功重新呈现。

class Navbar extends React.Component {
    constructor(props) {
        super(props);
        this.state = {isVisible: false};
    }
    render() {
        console.log('hi')
        return(
            <div className = 'navbar'>
                <div className = 'nav-button'
                    onClick = {() => this.setState({isVisible: !this.state.isVisible})}>
                </div>
           
     
            </div>
        );
    }
}

如果 div 没有内容,您如何点击它?我相信你错了,你一开始就触发了 onClick 。您可以在下面看到一个简化的 运行 示例,说明它实际上是如何工作的(可点击的 div 现在有一个标签“测试”)。

class Navbar extends React.Component {
    constructor(props) {
        super(props);
        this.state = {isVisible: false};
    }
    render() {
        console.log('hi')
        return(
            <div className = 'navbar'>
                <div className = 'nav-button'
                    onClick = {() => this.setState({isVisible: !this.isVisible})}>test
                </div>
                    <div className = 'navbar-content row'>
                        <div className="navbar-item col s1 offset-s6"><h5 className="center-align">Home</h5></div>
                        <div className="navbar-item col s1"><h5 className="center-align">About</h5></div>
                        <div className="navbar-item col s1"><h5 className="center-align">Home</h5></div>
                        <div className="navbar-item col s1"><h5 className="center-align">About</h5></div>
                    </div>
            </div>
        );
    }
}

ReactDOM.render(<Navbar />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />

如果您的新状态取决于之前的状态,请使用 setStatefunctional form

...
onClick = {() => this.setState((prevState) => ({isVisible: !prevState.isVisible}))}
...