Задать вопрос
@JavaSscriptNoob

Как декомпозировать логику формы React?

Всем привет , у меня есть форма которая содержит инпуты , всё управление состоянием находится в этой форме , поэтому на ввод в любом инпуте будет ре-рендерится вся форма . Хотелось бы узнать как можно переписать ( декомпозировать логику ) работы компонентов что бы на ввод в одном инпуте ре-рендерился он и только он . Был вариант вынести изм. состояния инпутов в компонент <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;
  • Вопрос задан
  • 173 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
insighter
@insighter
-First time? - Huh? (C#, React, JS)
Можно вручную работать с инпутом.

const inputRef = useRef();

useEffect(()={
  const inputEl = inputRef.current;
  inputEl.value = "initial value";
  ...
  inputEl.addEventListenter("change", handleChange)
  return () => inputEl.removeEventListenter("change", handleChange);
});

return (
  ...
  <input ref={inputRef} ...
);


Это набросок, его надо адаптировать под вашу задачу
Ответ написан
KataevAS
@KataevAS
Мемоизировать компоненты формы с помощью React.memo. Тогда они будут ререндериться только если изменятся именно их пропсы.
https://ru.reactjs.org/docs/react-api.html#reactmemo
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы