Реакция: нажатие кнопки не записывает на консоль

#javascript #arrays #reactjs #object #debugging

#javascript #массивы #reactjs #объект #отладка

Вопрос:

У меня есть кнопка, и в целях тестирования я хочу записать в консоль индекс элемента массива. Более конкретно, у меня есть кнопка в button.js , и эта кнопка отображается на каждом элементе массива в массиве IncomeOutputList. При нажатии я хочу, чтобы каждая кнопка выводила на консоль индекс соответствующего элемента массива IncomeOutputList. Например, нажав на кнопку второго элемента, показанного на изображении ниже, я хочу, чтобы консоль отображала индекс 1 (первый элемент — это самый верхний прямоугольник, который является пустым элементом массива).

Вот изображение элемента массива с кнопкой, кнопка появляется при наведении курсора мыши на номер для каждого элемента массива:

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

button.js:

 import React from 'react';

const Button = ({buttonType, handler}) => (
    <>
        <div className="item__delete">
            <button className={buttonType} onClick={handler}>
                <i className="ion-ios-close-outline"></i>
            </button>
        </div>
    </>
)

export default Button;
  

ValueOutput.js:

 import React from 'react';
import Button from '../buttons/Button';

//move item__value element to left when hovering over it, and make delete button appear

const ValueOutput = ({type, value, handleClick}) => {
    
    return (
        <>
            <div className="right clearfix">
                <div className="item__value">{type} {value}</div>
                <Button buttonType="item__delete--btn" handler={handleClick}/>
            </div>
        </>
    )
}

export default ValueOutput;
  

IncomeOutput.js:

 import React from 'react';
import ValueOutput from './ValueOutput';

const IncomeOutput = ({ desc, type,id, value, handleButton }) => {
    //id = inc-{id}
        return (
            <>
                <div className="item clearfix income" id={id}>
                    <div className="item__description">{desc}</div>
                        <ValueOutput
                            type={type}
                            value={value}
                            handleClick={handleButton}
                        />
                </div>
            </>
        )
    }

export default IncomeOutput;
  

IncomeOutputList.js:

 import React from 'react';
import IncomeOutput from './IncomeOutput';


// list will be list of income objects
const IncomeOutputList = ({ list }) => {

    const handler = (i) => {
        console.log(i);
        console.log('the test');
    }

    return (
        <div className="income__list">
            <div className="income__list--title">INCOME</div>
            {list.map((item, index) => <IncomeOutput 
                                id={item.id} 
                                value={item.incomeValue} 
                                type={item.budgetType} 
                                desc={item.desc} 
                                handleButton={handler(index)} 
                                />
            )}
        </div>
    )
}
  

Ответ №1:

Вы передаете handler(index) в качестве своего обработчика событий. Поскольку это ничего не возвращает, вы фактически передаете undefined в качестве своего обработчика. Вы захотите изменить свой метод обработчика, чтобы возвращать функцию:

 const handler = (i) => {
    return () => {
        console.log(i);
        console.log('the test');
    };
};
  

Вы также можете просто обернуть свой вызов обработчика в функцию, buttonHandle={() => handler(index)} — это фактически то же самое.

Ответ №2:

Проблема в том, что handler функция выполняется сразу при обнаружении кода.

Всякий раз, когда у вас есть () функция, она будет выполняться сразу же при обнаружении. Он не ожидает запуска события.

Вот что вы можете сделать:

 handleButton={() => handler(index)}