#reactjs #typescript #react-hooks
Вопрос:
Воспроизводимый пример можно найти по этой ссылке.
Я начинаю с Реакции и крючков. В настоящее время я пытаюсь создать форму конфигурации для создания некоторых отчетов. Первый подкомпонент всей моей формы, которую я создаю,-это Filter
компонент только с двумя датами (датой начала и датой окончания).
Во внешнем вызываемом компоненте Configuration
у меня есть состояние формы, а даты начала и окончания передаются реквизитами Filter
компоненту, а также обратный onPeriodChange
вызов:
export const Configuration: React.FC = () => {
const [periodState, setPeriodState] = useState<Period>({
startDate: '',
endDate: '',
});
const handlePeriodChange = useCallback(
(field: keyof Period, value: string) =>
setPeriodState({ ...periodState, [field]: value }),
[periodState],
);
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<form name="configuration">
<Filters period={periodState} onPeriodChange={handlePeriodChange} />
</form>
</MuiPickersUtilsProvider>
);
};
Затем реквизиты передаются KeyboardDatePicker
компонентам в Filter
компонентах:
export const Filters: React.FC<FilterProps> = (filterProps: FilterProps) => {
const { period, onPeriodChange } = filterProps;
return (
(...)
<KeyboardDatePicker
disableToolbar
fullWidth
variant="inline"
format="dd/MM/yyyy"
id="start-date"
label="Data de descarga inicial:"
value={period.startDate}
onChange={(date) => {
onPeriodChange(
'startDate',
date instanceof Date amp;amp; !Number.isNaN(date)
? date.toISOString()
: '',
);
}}
required
KeyboardButtonProps={{
'aria-label': 'change date',
}}
/>
(...)
);
};
При первом рендеринге компоненты отображаются как недопустимые:
И когда я изменяю значение первого компонента, я получаю предупреждение консоли (вы можете воспроизвести это поведение в песочнице).:
Предупреждение: Компонент изменяет неконтролируемый вход для управления. Вероятно, это вызвано изменением значения с неопределенного на определенное значение, чего не должно произойти. Решите, использовать ли управляемый или неконтролируемый входной элемент в течение всего срока службы компонента.
Я не знаю, почему я получаю эту ошибку, так как начальные значения даты начала и окончания являются пустой строкой (и не неопределенной). Можете ли вы указать мне, где моя ошибка? Спасибо!
Комментарии:
1. Вы пробовали отлаживать его, чтобы увидеть, действительно ли значения не определены в какой-либо момент времени? Кроме того, вы можете избежать зависимости в своем
useCallback
крючке, используя функциональное обновление
Ответ №1:
Это связано с тем , что значение периода изменяется с пустой строки на a Date
, в вашем начальном значении вы также должны передать a Date
.
Предупреждение: Компонент изменяет неконтролируемый вход для управления. Вероятно, это вызвано изменением значения с неопределенного на определенное значение, чего не должно произойти. Решите, использовать ли управляемый или неконтролируемый входной элемент в течение всего срока службы компонента.
Обновление интерфейса
export interface Period {
startDate: Date;
endDate: Date;
}
Обновление начального состояния
const [periodState, setPeriodState] = useState<Period>({
startDate: new Date(Date.now()),
endDate: new Date(Date.now())
});