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

React切换状态仅触发一次:如何实现每次点击均切换状态?

问题分析与解决方法

问题原因

代码里useCallback的依赖数组是空的,导致toggleDark函数始终捕获组件初始渲染时的dark值(true)。第一次点击时,setDark(!dark)会把状态设为false,但后续点击时,函数里的dark还是初始的true,所以每次调用都是设置false,状态不再切换。

解决方案

有两种可行的修复方式:

方式一:添加状态依赖到useCallback

把dark加入useCallback的依赖数组,这样每当dark状态变化时,toggleDark都会重新创建,捕获最新的状态值:

import React from 'react'
import { useState, useCallback } from 'react'

export default function App() {
    let [dark, setDark] = useState(true)

    const toggleDark = useCallback(() => {
        setDark(!dark)
    }, [dark]); // 添加dark作为依赖

    return (
        <main>
            <p onClick={toggleDark}>{dark ? 'dark mode' : 'light mode'}</p>
        </main>
    )
}

方式二:使用函数式更新状态

调用setDark时传入一个函数,利用函数式更新获取上一次的状态值,这样不需要依赖dark,也能保证每次都基于最新状态切换:

import React from 'react'
import { useState, useCallback } from 'react'

export default function App() {
    let [dark, setDark] = useState(true)

    const toggleDark = useCallback(() => {
        setDark(prevDark => !prevDark) // 函数式更新,获取上一次状态
    }, []); // 依赖数组保持为空即可

    return (
        <main>
            <p onClick={toggleDark}>{dark ? 'dark mode' : 'light mode'}</p>
        </main>
    )
}

推荐第二种方式,尤其是当你需要toggleDark保持稳定引用(比如传递给子组件避免不必要重渲染)时,函数式更新+空依赖数组的组合更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:37:37