Всем привет , у меня есть форма которая содержит инпуты , всё управление состоянием находится в этой форме , поэтому на ввод в любом инпуте будет ре-рендерится вся форма . Хотелось бы узнать как можно переписать ( декомпозировать логику ) работы компонентов что бы на ввод в одном инпуте ре-рендерился он и только он . Был вариант вынести изм. состояния инпутов в компонент
<InputItem/>
но тогда родительская форма не будет знать какие данные там находятся . Знаю вариант с исп. Context.API но как то не хочется к нему прибегать . Может есть другие варианты ? Спасибо .
const RegistrationForm = () => {
const [password, setPass] = useState("");
const [email, setEmail] = useState("");
const [name, setName] = useState("");
const [surName, setSurName] = useState("");
const dispatch = useDispatch();
const navigator = useNavigate();
const columns = [
{
value: email,
onChangeEvent: setEmail,
type: "text",
className: "form-control",
id: "floatingInput",
placeholder: "name@example.com",
label: "enter your e-mail",
},
{
value: name,
onChangeEvent: setName,
type: "text",
className: "form-control",
id: "floatingInput",
placeholder: "your first name",
label: "your first name",
},
{
value: surName,
onChangeEvent: setSurName,
type: "text",
className: "form-control",
id: "floatingInput",
placeholder: "your last name",
label: "your last name",
},
{
onChangeEvent: setPass,
value: password,
type: "password",
className: "form-control",
id: "floatingPassword",
placeholder: "Password",
label: "Password",
},
];
return (
<main className='form-signin text-center d-flex justify-content-center'>
<form className='col-6'>
<h1 className='h3 mb-3 fw-normal'>Please sign up</h1>
{columns.map((column) => {
return (
<InputItem
onChangeEvent={column.onChangeEvent}
value={column.value}
type={column.type}
className={column.className}
id={column.id}
placeholder={column.placeholder}
label={column.label}
/>
);
})}
<button
className='w-100 btn btn-lg btn-primary'
type='submit'
onClick={(e) => {
e.preventDefault();
dispatch(userRegistation({ email, password, name, surName }));
setPass("");
setEmail("");
setName("");
setSurName("");
navigator("/login");
}}>
Sign up
</button>
</form>
</main>
);
};
export default RegistrationForm;