Почему моя функция обратного вызова в react работает хорошо только одним способом?

#javascript #reactjs #callback #react-hooks

#javascript #reactjs #обратный вызов #реагирующие хуки

Вопрос:

Я пишу приложение для контроля долгов. Я написал логику для своих компонентов. Я использую реквизиты и обратные вызовы для передачи значений от дочернего элемента к родительскому.

Я написал 3 файла.

App.js

 const App = () => {
  const [debts, setDebts] = useState([
    {id: 1, debtor: "Kamil", amount: 14.3, loanFrom: new Date(2021,1,1).toLocaleDateString(), loanTo: new Date(2021,1,4).toLocaleDateString(), paidBackAmount: 0, isPaidBack: false},
    {id: 2, debtor: "Adam", amount: 30, loanFrom: new Date(2020,12,14).toLocaleDateString(), loanTo: new Date(2020,12,30).toLocaleDateString(), paidBackAmount: 10, isPaidBack: false},
    {id: 3, debtor: "Kamil", amount: 20, loanFrom: new Date(2020,12,18).toLocaleDateString(), loanTo: new Date(2020,12,20).toLocaleDateString(), paidBackAmount: 20, isPaidBack: true},
    {id: 4, debtor: "Marcin", amount: 40, loanFrom: new Date(2020,12,15).toLocaleDateString(), loanTo: new Date(2021,1,1).toLocaleDateString(), paidBackAmount: 20, isPaidBack: false},
  ])
  const changeDebtPaidBack = index => {
    let cDebts = [...debts];
    let indexToChange = debts.findIndex(debt=>debt.id===parseInt(index))
    if(cDebts[indexToChange].isPaidBack){
      cDebts[indexToChange].isPaidBack = !cDebts[indexToChange].isPaidBack;
      cDebts[indexToChange].paidBackAmount = cDebts[indexToChange].amount;
    }
    else{
      cDebts[indexToChange].isPaidBack = !cDebts[indexToChange].isPaidBack;
      cDebts[indexToChange].paidBackAmount = 0;
    }
    setDebts(cDebts) 
  }
//RETURN
  return (
    <div className="App">
      <LoanTable debts={debts} ofPaid={false} callback={changeDebtPaidBack}/>
      {showPaidBacks amp;amp; <LoanTable debts={debts} ofPaid={true} /> }
    </div>
  );
}
 

LoanTable.js

 const LoanTable = (props) => {
    const handler = index =>{
        props.callback(index)
    }
    return (
        
    <table className="table table-striped table-bordered">
        <thead>
            {...}
        <tbody>
            {props.debts.filter(debt => debt.isPaidBack===props.ofPaid)
             .map(debt => <LoanTableRow debt={debt} onClickRow={handler}/>)}
        </tbody>
    </table>
    )
}
 

LoanTableRow.js

 const LoanTableRow = ({debt, onClickRow}) => {
    return (
            <tr key={debt.index}>
              <td>{debt.debtor}</td>
              <td>{debt.amount}</td>
              <td>{debt.paidBackAmount}</td>
              <td>{debt.loanFrom}</td>
              <td>{debt.loanTo}</td>
              <td>
                <input type="checkbox" checked={debt.isPaidBack} name={debt.id}
                  onClick={event => onClickRow(event.target.name)}
                />
              </td>
            </tr>
    )
}
 

Когда я меняю флажок в LoanTableRow, когда он снят, он меняет состояние хорошо, как я и ожидал.
Но если это проверено, реагируйте на выброс TypeError: props.callback is not a function

Как я могу решить мою проблему и сохранить функциональность моего кода? Я пробовал несколько способов, но без ожидаемого результата: (

Комментарии:

1. Вы забыли передать реквизит обратного вызова во втором <LoanTable

2. В моем часовом поясе почти 3 часа ночи .. Определенно пора спать. Я потратил больше времени на написание этого поста, чем на то, чтобы решить его с помощью вашего ответа. Большое спасибо: P