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

React父组件用let声明的非state变量传给子组件时为null如何解决

问题根因

React函数组件每次触发重新渲染时,都会完整执行一遍函数体,你用let声明的普通变量会在每次渲染时被重置为初始值null。你点击按钮触发setData的流程是:先给data赋值为Test,之后调用setShowChild触发父组件重新渲染,此时父组件函数重新执行,let data = null会把之前的赋值覆盖为初始值,所以渲染子组件时传递过去的值就是null。

解决方法

如果你不想把这个变量绑定为可触发渲染的state,可以用useRef存储可变值,useRef的current属性在组件多次渲染之间会保持稳定,不会因为重新渲染被重置。

修改后代码示例
import { useState, useRef } from 'react';
import ReactDOM from 'react-dom';

function Parent() {
    const [showChild, setShowChild] = useState(false);
    // 用useRef存储渲染间需要保留的可变值
    const dataRef = useRef(null);

    const setData = () => {
      dataRef.current = 'Test';
      setShowChild(true);
      console.log('function called');
    };

    return (
      <>
        <button onClick={setData}>
          Click Me
        </button>
        {showChild && <Child data={dataRef.current} />}
      </>
    );
}

function Child({data}) {
    console.log('data '  + data);
    return (
      <>
        <h2>
          {data}
        </h2>
      </>
    );
}

ReactDOM.render(
  <Parent />, 
  document.getElementById('mountNode'),
);

补充说明:如果后续这个变量的值变化后需要同步更新已渲染子组件的内容,还是需要将其声明为state,因为useRef的current属性变化不会触发组件重新渲染,只有state变化才会触发重渲染更新视图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:15:05