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

React函数组件使用ContextAPI开发支出跟踪器报错如何解决

React Context API 报错修复方案

错误原因

  • 函数组件不存在this实例,你代码中调用的this.props.children属于类组件的写法,函数组件无法读取this.props属性,这就是你看到的报错的直接诱因。
  • createContext方法不能写在Provider组件内部,否则每次Provider组件重新渲染时都会生成全新的Context实例,之前的Context绑定关系会全部失效,无法实现全局状态共享的需求。

修正后的代码

1. Context和Provider组件代码

// createContext要放在Provider组件外部定义,可传入默认值
const ExpenseNumbers = createContext();

function ExpenseNumbersProvider ({ children }) {
  const [monthly, setMonthly] = useState(0);
     
  return(
    <ExpenseNumbers.Provider value={{ monthly, setMonthly }}>
      {/* 直接使用入参接收的children,不需要调用this.props */}
      {children}
    </ExpenseNumbers.Provider>
  )
} 

// 导出Context供下级组件消费
export { ExpenseNumbers, ExpenseNumbersProvider }

2. 原有App组件代码无需修改,保持现有写法即可

function App(){
  return(
    <ExpenseNumbersProvider>
      <div className="flex-container">
        <div className="left">
          <Input /> 
          <Graph />
        </div>
        <ExpenseLog />
      </div>
    </ExpenseNumbersProvider>
  )
};

下级组件消费Context示例

如果业务组件需要读取共享的monthly状态,可通过useContext钩子直接获取:

import { useContext } from 'react'
import { ExpenseNumbers } from 'Provider对应文件路径'

function Input() {
  // 直接解构获取需要的状态和修改方法
  const { monthly, setMonthly } = useContext(ExpenseNumbers)
  // 后续编写业务逻辑即可
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:06:01