You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React类组件导航栏明暗模式切换报错:无法读取undefined的state属性

问题解决:React类组件明暗模式切换时的this指向错误

错误根源

将toggle方法直接传给onClick回调时,类方法的this上下文会丢失,调用时this变为undefined,因此无法读取this.state。

三种可行修复方案

方案1:在构造函数中绑定this

手动将toggle方法的this绑定到组件实例,确保调用时上下文正确:

constructor() {
    super();
    this.state = {
        mode: "light"
    };
    // 绑定this到组件实例
    this.toggle = this.toggle.bind(this);
}

方案2:用箭头函数定义toggle方法

箭头函数会自动继承外层的this,无需额外绑定,同时可以简化状态更新逻辑:

// 移除不必要的async(切换逻辑无异步操作)
toggle = () => {
    this.setState(prevState => ({
        mode: prevState.mode === "light" ? "dark" : "light"
    }));
}

方案3:在onClick中用箭头函数包裹调用

直接在事件回调里用箭头函数确保this指向组件实例:

<input 
    className="form-check-input" 
    type="checkbox" 
    role="switch" 
    id="flexSwitchCheckDefault" 
    onClick={() => this.toggle()} 
/>

完整修正代码(以方案2为例)

import React, { Component } from 'react'
import { Link } from 'react-router-dom'

export class Navbar extends Component {
    constructor() {
        super();
        this.state = {
            mode: "light"
        };
    }
   
    toggle = () => {
        this.setState(prevState => ({
            mode: prevState.mode === "light" ? "dark" : "light"
        }));
    } 
    
    render() {
        return (
            <div>
                <nav className={`navbar navbar-expand-lg navbar-${this.state.mode} bg-${this.state.mode}`}>
                    <div className="container-fluid">
                        <Link className="navbar-brand" to="/">EasyNews</Link>
                        <button className="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                            <span className="navbar-toggler-icon"></span>
                        </button>
                        <div className="collapse navbar-collapse" id="navbarSupportedContent">
                            <ul className="navbar-nav me-auto mb-2 mb-lg-0">
                                <li className="nav-item">
                                    <Link className="nav-link" aria-current="page" to="/">Home</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/business">Business</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/entertainment">Entertainment</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/health">Health</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/science">Science</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/sports">Sports</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/technology">Technology</Link>
                                </li>
                                <li className="nav-item">
                                    <Link className="nav-link" to="/about">About</Link>
                                </li>
                            </ul>
                        </div>
                        <div className="form-check form-switch">
                            <input 
                                className="form-check-input" 
                                type="checkbox" 
                                role="switch" 
                                id="flexSwitchCheckDefault" 
                                onClick={this.toggle} 
                            />
                        </div>
                    </div>
                </nav>
            </div>
        )
    }
}

export default Navbar

内容的提问来源于stack exchange,提问作者SCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:43:13