#reactjs #event-handling #react-hooks #state
#reactjs #обработка событий #реагировать-перехваты #состояние
Вопрос:
У меня есть некоторый код ниже, где я изменил состояние в моем родительском компоненте для размера в виде пустой строки.
То, что я пытаюсь сделать, это создать функцию-обработчик, которая будет принимать внутренний текст кнопки onClick и обновлять состояние size этим значением.
import { Child } from './Child';
import React, { useState } from 'react';
export default function Parent() {
const [state, setState] = useState({
name: 'bob',
size: '',
});
const handleSize = (e) => {
setState((state) => ({
...state,
size: e.target.innerText,
}));
};
return (
<Child
size={state.size}
onClick={handleSize}
/>
);
}
Вот дочерний компонент с кнопкой, внутренний текст которой равен 500. — Я просто хочу установить состояние size на любое значение, которое находится внутри моего элемента button, но, похоже, это не работает.
EDIT1: обновленный код для отправки размера дочернему элементу.
EDIT2: этот текущий код выдает ОШИБКУ ТИПА: «Невозможно прочитать свойство «innerText» из null» Это потому, что получение внутреннего текста элементов JSX отличается от элементов HTML?
EDIT3: я ответил на свой собственный вопрос ниже. Моя функция обработчика требовала корректировки.
export const Child = ({
size,
onClick,
}) => {
return (
<div>
<button onClick={onClick}>500</button>
</div>
);
};
Комментарии:
1. Это выглядит разумно, но поскольку
size
нигде не используется, вы не увидите эффекта от изменения состояния2. Ах, смотрите мой обновленный код. Однако сейчас я передаю размер вниз, где я должен объявить его, чтобы получить статическое значение из элемента button? может быть, значение = {size} в кнопке?
3. Вам не нужно обязательно передавать его, вам просто нужно, чтобы оно где -то использовалось, чтобы вы могли визуально видеть изменение состояния. Даже a
console.log(size)
должен это сделать — что вы пытаетесь сделать с этим свойством?4. У меня будет несколько кнопок с разными значениями размера. После нажатия обновленное состояние обновит размер другого элемента (ширину).
5. Затем вам нужно где-то реализовать эту ширину, чтобы увидеть эффект изменения состояния, в противном случае он фактически невидим
Ответ №1:
Попробуйте:
const handleSize = (e) => {
setState((state) => ({
...state,
size: e.target.innerText,
}))
}
https://reactjs.org/docs/hooks-reference.html#functional-updates
Ответ №2:
Хорошо, проблема обнаружена, моя функция обработчика нуждалась в некоторых корректировках.
const handleSize = (e) => {
const { value } = e.target;
setState((state) => ({
...state,
size: value,
}));
};
Вместо того, чтобы использовать внутренний текст кнопки, я решил вместо этого использовать значение.
const { value } = e.target; //assigns the target value to my size property
Ниже приведена обновленная кнопка со статическим значением «500». Функция handleSize обновит размер onClick, используя присвоенное кнопке значение.
export const Child = ({
size,
onClick,
}) => {
return (
<div>
<button value="500" onClick={onClick}>500</button>
</div>
);
};