Реагируйте: получите сумму значений дочернего компонента в родительском компоненте

Родительский компонент может получить доступ к значениям дочернего компонента, но не может суммировать значения каждого дочернего компонента. В сумме отображается 0 вместо правильной суммы.

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

Родительский компонент

import { useState } from "react"
import SingleEntry from "./SingleEntry"

const TaxSource = ({ type }) => {
    const [valuesFromSingleEntries, setValuesFromSingleEntries] = useState([])

    const sendDataToTaxSource = (value, index) => {
        const newValues = [...valuesFromSingleEntries]
        newValues[index] = value
        setValuesFromSingleEntries(newValues)
    }

    console.info(valuesFromSingleEntries)

    const total = valuesFromSingleEntries.reduce((a, b) => a + b, 0)

    return (
        <>
            <h3>{type}</h3>
            <label
                htmlFor='income'
                className='block text-sm font-medium leading-6 text-gray-900 mt-6'
            >
                Income: {type}
            </label>
            {Array.from({ length: 5 }, (_, i) => (
                <SingleEntry key = {i} sendDataToTaxSource = {sendDataToTaxSource} />
            ))}

            <p>Total: {total}</p>

        </>
    )
}

export default TaxSource

Дочерний компонент

import { useState } from "react"

const SingleEntry = ({ sendDataToTaxSource, index }) => {
    const [value, setValue] = useState(0)
    const handleValueChange = (e) => {
        setValue(e.target.value)
    }
    const handleBlur = (e) => {
        let inputValue = e.target.value
        if (!isNaN(inputValue)) {
            setValue(parseFloat(inputValue).toFixed(2))
        }
        sendDataToTaxSource(value, index)
    }
    return (
        <>
            <div className='sm:col-span-4'>
                <div className='flex mb-2 sm:w-128'>
                    <div className='flex flex-col mr-2 w-3/4'>
                        <input
                            type='text'
                            name='description'
                            id='description'
                            placeholder='Enter description'
                            className='border-2 rounded-sm px-3 my-[-3px]  border-gray-300 focus:outline-none focus:ring-1 focus:ring-indigo-600 focus:border-transparent'
                        />
                    </div>
                    <div className='flex flex-col ml-2 w-1/4'>
                        <input
                            type='number'
                            step='0.01'
                            name='value'
                            id='value'
                            value = {value}
                            onChange = {handleValueChange}
                            onBlur = {handleBlur}
                            placeholder='Enter value'
                            className='border-2 rounded-sm pr-3 my-[-3px] border-gray-300 focus:outline-none focus:ring-1 focus:ring-indigo-600 focus:border-transparent text-right'
                        />
                    </div>
                </div>
            </div>
        </>
    )
}
export default SingleEntry

Вы пытались его отладить? Вызывается ли ваша функция handleBlur? sendDataToTaxSource называется? Вызываются ли они с правильными аргументами? Обновляются ли переменные состояния должным образом?

Guillaume Brunerie 21.04.2024 17:01

@GuillaumeBrunerie Спасибо, что проверили проблему. Я не отлаживал. Я новичок в том, чтобы реагировать. Можете ли вы предложить подходящую функцию для замены handleBlur. Я использовал handleBlur для обновления значения singleEntry, когда фокус находится вне поля ввода.

Udayanga Wijesiri 21.04.2024 17:18

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

Guillaume Brunerie 21.04.2024 17:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что проблема в том, что SingleEntry ожидает опору index, которую вы не передаете от родителя.

Ответ принят как подходящий

Вы не передали index в SingleEntry, поэтому он не сможет обновить правильную позицию в массиве. Обновленный код должен быть:

{Array.from({ length: 5 }, (_, i) => (
  <SingleEntry key = {i} sendDataToTaxSource = {sendDataToTaxSource} index = {i} />
))}

Я скопировал ваш код для тестирования в codeandbox, после добавления index он теперь работает: https://codesandbox.io/p/sandbox/get-sum-kqxtcq?file=%2Fsrc%2FApp.js%3A65%2C22

Другие вопросы по теме