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

React函数组件setFunction通过函数引用调用失效问题

React函数组件state存储的点击函数仅首次生效问题

问题场景

实现点击按钮累加count的功能:函数组件中点击按钮后count仅首次增长,后续无变化;但类组件实现相同逻辑可正常运行。
函数组件里把返回按钮的函数存入了useState的content状态,改为普通const变量功能正常,但业务需要将该函数存在state中以实现复用和额外逻辑。

问题原因

函数组件中,useState的初始值只在组件首次渲染时执行一次。当button函数被存在content状态后,它捕获了首次渲染时的count(值为0)和handlePlus函数。后续组件重新渲染时,content状态没有更新,点击按钮时始终调用的是首次渲染时的handlePlus,里面的count一直是0,累加后变成1,之后再点击还是基于0计算,导致count停在1。
而类组件中this始终指向组件实例,this.handlePlus每次调用都能获取最新的this.state.count,所以可以正常累加。

解决方案

方案一:count变化时更新content状态

每次count更新后,重新创建button函数并更新content状态,确保函数能捕获最新的变量。

方案二:使用函数式更新count

修改handlePlus,直接用setCount的函数式更新,这样不需要依赖外部的count变量,即使函数是首次渲染时的版本,也能正确获取最新的count值。

代码示例

方案一代码

import React, { useState, useEffect } from "react";

function Page(props) {
    const [count, setCount] = useState(0);
    const [content, setContent] = useState({});

    // count变化时重新生成button函数并更新content
    useEffect(() => {
        setContent({
            button: (value) => {
                return <button onClick={() => handlePlus(value)}>+</button>;
            },
        });
    }, [count]);

    function handlePlus(value) {
        console.log("value=", value);
        setCount(count + 1);
    }

    return (
        <div>
            <span>Functional Component Count = {count}</span>
            {content.button?.(10)}
        </div>
    );
}

export default Page;

方案二代码

import React, { useState } from "react";

function Page(props) {
    const [count, setCount] = useState(0);

    const [content, setContent] = useState({
        button: (value) => {
            return <button onClick={() => handlePlus(value)}>+</button>;
        },
    });

    function handlePlus(value) {
        console.log("value=", value);
        // 函数式更新,直接获取上一次的count值
        setCount(prevCount => prevCount + 1);
    }

    return (
        <div>
            <span>Functional Component Count = {count}</span>
            {content.button(10)}
        </div>
    );
}

export default Page;

内容的提问来源于stack exchange,提问作者Harikrishnan.A.S -

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:51:10