Я пытаюсь управлять формой с помощью настраиваемого хука, поэтому у меня есть этот код
FormHook.tsx:
import { useState } from 'react';
interface ICampos {
name: string;
email: string;
password: string;
}
const useForm = (initialState: ICampos) => {
const [values, setValues] = useState(initialState);
const handleInputChange = ({ target }: any) => {
setValues({
...values,
[target.name]: target.value
})
};
return [values, handleInputChange];
}
export default useForm
FormWithCustomHook.tsx:
import React from 'react'
import './effects.css'
import useForm from '../../hooks/useForm';
interface ICampos {
name: string;
email: string;
password: string;
}
const FormWithCustomHook = () => {
const [formValues, handleInputChange] = useForm({
name: '',
email: '',
password: ''
});
const { name, email, password } = formValues;
return (
<>
<h1> FormWithCustomHook </h1>
<hr />
<div className="form-group">
<input
type="text"
name="name"
className="form-control"
placeholder="Tu nombre"
autoComplete="off"
value={name}
onChange={handleInputChange} />
</div>
<div className="form-group">
<input
type="email"
name="email"
className="form-control"
placeholder="email@ejemplo.com"
autoComplete="off"
value={email}
onChange={handleInputChange} />
</div>
<div className="form-group">
<input
type="password"
name="password"
className="form-control"
placeholder="*****"
autoComplete="off"
value={password}
onChange={handleInputChange} />
</div>
</>
)
}
export default FormWithCustomHook;
И я застрял с этой ошибкой в строке FormWithCustomHook.tsx:
const { name, email, password } = formValues;
Он отмечает ошибку только в адресе электронной почты и пароле:
'Свойство' email 'не существует для типа' ICampos | (({цель}: любой) => void) '. ts (2339)'
И в моем onChange внутри входов говорится:
Введите 'ICampos | (({target}: any) => void) 'не может быть присвоено типу' ((event: ChangeEvent) => void) | неопределенный'. Тип «ICampos» нельзя присвоить типу «(event: ChangeEvent) => void». Тип «ICampos» не соответствует сигнатуре »(событие: ChangeEvent): void'.ts (2322) index.d.ts (2092, 9): ожидаемый тип берется из свойства onChange, которое здесь объявлено для типа 'DetailHTMLProps
Я пытался добавить типы в customhook.tsx, но я действительно не понимаю эту ошибку
1 ответ
Хук не знает порядка массива. Так что это может быть ICampos | Handler
или Handler | ICampos
. У вас есть два варианта:
Вы можете ввести возвращаемый массив на крючок:
const useForm = (
initialState: ICampos
): [ICampos, ({ target }: any) => void] => {
const [values, setValues] = useState<ICampos>(initialState);
const handleInputChange = ({ target }: any) => {
setValues({
...values,
[target.name]: target.value
});
};
return [values, handleInputChange];
};
Или вы можете вернуть объект вместо массива. Я предпочитаю этот, так как не люблю печатать массивы.
import { useState } from "react";
interface ICampos {
name: string;
email: string;
password: string;
}
const useForm = (initialState: ICampos) => {
const [values, setValues] = useState<ICampos>(initialState);
const handleInputChange = ({ target }: any) => {
setValues({
...values,
[target.name]: target.value
});
};
return { values, handleInputChange };
};
export default useForm;
import React from "react";
import "./effects.css";
import useForm from "./useForm";
interface ICampos {
name: string;
email: string;
password: string;
}
const FormWithCustomHook = () => {
const { values, handleInputChange } = useForm({
name: "",
email: "",
password: ""
});
const { name, email, password } = values;
return (
<>
<h1> FormWithCustomHook </h1>
<hr />
<div className="form-group">
<input
type="text"
name="name"
className="form-control"
placeholder="Tu nombre"
autoComplete="off"
value={name}
onChange={handleInputChange}
/>
</div>
<div className="form-group">
<input
type="email"
name="email"
className="form-control"
placeholder="email@ejemplo.com"
autoComplete="off"
value={email}
onChange={handleInputChange}
/>
</div>
<div className="form-group">
<input
type="password"
name="password"
className="form-control"
placeholder="*****"
autoComplete="off"
value={password}
onChange={handleInputChange}
/>
</div>
</>
);
};
export default FormWithCustomHook;
Похожие вопросы
Новые вопросы
reactjs
React — это библиотека JavaScript для создания пользовательских интерфейсов. Он использует декларативную парадигму на основе компонентов и стремится быть эффективным и гибким.