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

React高阶组件状态变更未传props,组件控制台打印值但视图不更新

React HOC状态更新不生效的问题修复

问题根源

这段代码里最致命的错误是直接修改this.state——React组件的状态必须通过setState()方法更新,直接给this.state赋值不会触发组件重新渲染。所以5秒后虽然改了loading的值,但组件没重新render,MyComponent自然拿不到更新后的属性,视图也就一直显示初始的true。

修复后的完整代码

import React from "react";

const withLoading = (WrappedComponent) => {
    class WithLoading extends React.Component {
        constructor(props) {
            super(props)
            this.state = { loading: true };
        }

        componentDidMount() {
            setTimeout(() => {
                console.log("setTimeout")
                // 必须用setState更新状态,触发重新渲染
                this.setState({ loading: false });
            }, 5000)
        }

        render() {
            console.log("render", this.state.loading)
            return <WrappedComponent {...this.props} loading={this.state.loading} />;
        }
    }

    WithLoading.displayName = `withLoading(${WrappedComponent.displayName || WrappedComponent.name})`;

    return WithLoading;
}

function MyComponent({ loading }) {
    console.log("MyComponent loading", loading)
    return (<p>is loading:{loading}</p>)
}

const hoc = withLoading(MyComponent);

export default hoc

关键说明

  • 原代码里的props传递是没问题的({...this.props}已经把外部传入的props都传给了被包裹的组件),问题完全出在状态更新的方式上。
  • 使用setState()后,React会检测到状态变化,重新调用WithLoading的render方法,把更新后的loading: false传递给MyComponent,此时控制台会打印新的loading值,视图也会同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:15:00