#html #reactjs #web #react-hooks
#HTML #reactjs #веб #реагирующие хуки
Вопрос:
последнее значение поступает из реквизита, но когда оно добавляется в качестве начального значения для состояния, оно не отображается.
import React, { useRef, useState } from "react";
//import config from "../../../../../../config";
//import { getAuthToken } from "../../../../../utils/auth";
import styles from "./ContentRowPrice.module.css";
const ContentRowPrice = (props) => {
const [priceInput, setPriceInput] = useState(props.price);
// const priceInput = useRef();
// const handleBlur = () => {
// const price = parseFloat(priceInput.current.value);
// if (props.price === price) {
// } else {
// props.onPaywallChange(price);
// }
// };
const classes = styles["contentrowprice-input"];
return (
<>
<span>{props.price}</span>
<span>{priceInput}</span>
<input
id={`paywall_${props.price}_${props.id}`}
type="number"
min="0"
step="0.01"
// ref={priceInput}
// defaultValue={props.price}
value={priceInput}
className={classes}
// onBlur={handleBlur}
/>
</>
);
};
export default ContentRowPrice;
одна вещь, которую я понял, что значение 10 на самом деле поступает из ввода, который ранее был на месте указанного выше ввода.
Комментарии:
1. Можете ли вы поделиться тем, что представляет собой рендеринг
ContentRowPrice
и передачуprice
значения prop? Я подозреваю, что в игре присутствует некоторая асинхронная логика, иprice
это не то значение, которое вы ожидаете приContentRowPrice
монтировании компонента. Можете ли вы также уточнить, что именно означает «не отображается»?2. Это также обычно считается антишаблоном в React для хранения переданных реквизитов в локальном состоянии. Можете ли вы объяснить вариант использования?
3. да, я только что понял, что мне не нужно локальное состояние, если я передаю реквизиты. Прошу прощения за это.
Ответ №1:
Первый рендеринг компонента React выполняется с пустыми значениями, это момент, когда компонент react создает компонент и состояние с useState
помощью hook .
Когда вы назначаете его useState
, оно не изменится во втором (или более позднем) повторном рендеринге без useEffect
перехвата.
useEffect(() => {
setPriceInput(props.price);
}, [props.price]);
Подробнее об этой проблеме вы можете прочитать здесь:
https://medium.com/@digruby/do-not-use-props-as-default-value-of-react-usestate-directly-818ee192f454