Javascript 类型错误:props.onSaveExpenseData不是函数

Javascript 类型错误:props.onSaveExpenseData不是函数,javascript,reactjs,Javascript,Reactjs,我正在学习如何在React中将数据从子组件发送到父组件 收到此错误的原因:TypeError:props.onSaveExpenseData不是函数 请帮助我,因为我在学习阶段,由于这个错误,我被困在这个和 我不能继续下节课的进一步学习了 子组件中显示错误 这里是同一文件的github链接 以下是文件名为-NewExpense.js的父组件代码- import ExpenseForm from './ExpenseForm' import './NewExpense.css'

我正在学习如何在React中将数据从子组件发送到父组件

收到此错误的原因:TypeError:props.onSaveExpenseData不是函数

请帮助我,因为我在学习阶段,由于这个错误,我被困在这个和 我不能继续下节课的进一步学习了

子组件中显示错误

这里是同一文件的github链接

以下是文件名为-NewExpense.js的父组件代码-

    import ExpenseForm from './ExpenseForm'
    import './NewExpense.css'
    
    function NewExpense () {
        const saveExpenseDataHandler = (enteredExpenseData)=> {
            const expenseData = {
                ...enteredExpenseData,
                id: Math.random().toString()
            };
    
            console.log(expenseData);
        } 
        return (
            <div className='expense-item'>
                <ExpenseForm onSaveExpenseData={saveExpenseDataHandler}/>
            </div>
        )
    }
    
    export default NewExpense;

从导入ExpenseForm./ExpenseForm'
导入“./NewExpense.css”
函数NewExpense(){
const saveExpenseDataHandler=(enteredExpenseData)=>{
const expenseData={
…输入ExpenseData,
id:Math.random().toString()函数
};
控制台日志(expenseData);
} 
返回(
)
}
出口违约费用;
这是文件名为ExpenseForm.js的子组件

import React, { useState } from "react";
import './ExpenseForm.css'

function ExpenseForm(props) {

  const [enteredTitle,setEnteredTitle] = useState('');
  const [enteredAmount,setEnteredAmount] = useState('');
  const [enteredDate,setEnteredDate] = useState('');

  const titleChangeHandler = (event) =>{
    setEnteredTitle(event.target.value);
    
  } 
  const amountChangeHandler = (event) =>{
    setEnteredAmount(event.target.value);
    
  }
  const dateChangeHandler = (event) =>{
    setEnteredDate(event.target.value);
    
  }
  
  const submitHandler = (event) => {
    event.preventDefault();
    
    const expenseData = {
      title: enteredTitle,
      amount: enteredAmount,
      date: new Date(enteredDate)
    };

    props.onSaveExpenseData(expenseData);  //here error arrives
    console.log(expenseData);

    setEnteredTitle('');
    setEnteredAmount('');
    setEnteredDate('');
  };

  return (
    <form onSubmit={submitHandler}>
      <div className='new-expense__controls'>
        <div className='new-expense__control'>
          <label>Title</label>
          <input type="text"
           value={enteredTitle}
           onChange={titleChangeHandler} />
        </div>
        <div className='new-expense__control'>
          <label>Amount</label>
          <input type="number" 
           value={enteredAmount}
           onChange={amountChangeHandler} min="0.01" step="0.01" />
        </div>
        <div className='new-expense__control'>
          <label>Date</label>
          <input type="date" 
           value={enteredDate}
           onChange={dateChangeHandler} min="2020-01-01" max="2021-12-31" />
        </div>
        <div className='new-expense__actions'>
        <button type='submit'>Add Expense</button>
      </div>
      </div>
    </form>
  );
}

export default ExpenseForm;

~~~


  [1]: https://github.com/academind/react-complete-guide-code/blob/04-react-state-events/code/07-lifting-the-state-up/src/components/NewExpense/ExpenseForm.js
import React,{useState}来自“React”;
导入“./ExpenseForm.css”
功能费用表(道具){
常量[enteredTitle,setEnteredTitle]=useState(“”);
常量[enteredAmount,setEnteredAmount]=useState(“”);
常量[enteredDate,setEnteredDate]=使用状态(“”);
常量标题更改处理程序=(事件)=>{
setEnteredTitle(event.target.value);
} 
常量amountChangeHandler=(事件)=>{
setEnteredAmount(event.target.value);
}
常量dateChangeHandler=(事件)=>{
setEnteredDate(event.target.value);
}
常量submitHandler=(事件)=>{
event.preventDefault();
const expenseData={
标题:Entereditle,
金额:输入金额,
日期:新日期(输入日期)
};
props.onSaveExpenseData(expenseData);//这里出现错误
控制台日志(expenseData);
setEnteredTitle(“”);
setEnteredAmount(“”);
设定值(“”);
};
返回(
标题
数量
日期
增加费用
);
}
导出默认费用表;
~~~
[1]: https://github.com/academind/react-complete-guide-code/blob/04-react-state-events/code/07-lifting-the-state-up/src/components/NewExpense/ExpenseForm.js

确保更改app.js文件并添加组件

<div>
  <NewExpense onAddExpense={addExpenseHandler} />
  <Expenses items={expenses} />
</div>


我看不出您的代码有任何问题。你能提供一个小的回购协议来重现你的问题吗?你的代码恰到好处,只是把它放到一个沙箱里,就像一个符咒。沙盒:单击“添加费用”按钮时出错。是否保存所有文件?你确定你没有在其他地方使用ExpenseForm吗?