response-hook-form регистрирует только данные формы последнего шага в многоуровневой форме

Я создал многоуровневую форму, используя эту статью css-tricks.com, и я пытаюсь проверить форму с помощью react-hook-form, но react-hook-form видит только входные данные step3, и мне нужны все входные данные от step1 до step3, чтобы я мог проверить и отправить на сервер. Это простая форма регистрации для веб-приложения.

import React, { useState } from "react"
import { Link } from "gatsby"
import { useForm } from "react-hook-form"
import { FormTitle } from "../components/input"
import { StepOne, StepTwo, StepThree } from "../components/joinFormSteps"

export default function () {
  const [currentStep, setCurrentStep] = useState(1)
  const { register, handleSubmit } = useForm()

  const _next = () => {
    // If the current step is 1 or 2, then add one on "next" button click
    setCurrentStep(currentStep >= 2 ? 3 : currentStep + 1)
  }

  const _prev = () => {
    // If the current step is 2 or 3, then subtract one on "previous" button click
    setCurrentStep(currentStep <= 1 ? 1 : currentStep - 1)
  }

  const previousButton = () => {
    if (currentStep !== 1) {
      return (
        <button className={styles.join__nxtbutton} type="button" onClick={_prev}>
          Previous
        </button>
      )
    }
    // ...else return nothing
    return null
  }

  const nextButton = () => {
    if (currentStep < 3) {
      return (
        <button
          className={`${styles.join__nxtbutton} ${
            currentStep === 1 ? styles.join__btnMarginRightZero : ""
          } `}
          type="button"
          onClick={_next}
        >
          Next
        </button>
      )
    }

    if (currentStep === 3) {
      return (
        <input
          className={`${styles.join__nxtbutton} ${
            currentStep === 1 ? styles.join__btnMarginRightZero : ""
          } `}
          type="submit"
          name="submit"
          value="Join Now"
        />
      )
    }
    // ...else render nothing
    return null
  }

  const onSubmit = data => {
    console.log(data)
  }

  return (
    <div className={styles.join}>
      <FormTitle title="Become a member" />

      <form className={styles.form} onSubmit={handleSubmit(onSubmit)}>
        <StepOne currentStep={currentStep} register={register} />
        <StepTwo currentStep={currentStep} register={register} />
        <StepThree currentStep={currentStep} register={register} />

        <div className={styles.join__buttonArea}>
          <Link to="/sign-in" className={styles.join__link}>
            Sign in instead
          </Link>
          <div>
            {previousButton()}
            {nextButton()}
          </div>
        </div>
      </form>
    </div>
  )
}

Реализация

import React from "react"
import { Input, SelectInput, CheckboxInput } from "../components/input"
import states from "../assets/nigeria-states.json"
import styles from "./joinFormSteps.module.scss"

export function StepOne({ currentStep, register }) {
  if (currentStep !== 1) {
    return null
  }

  return (
    <React.Fragment>
      <div className={styles.form__row}>
        <div className={styles.form__input}>
          <Input
            label="Firstname*"
            name="firstname"
            type="text"
            placeholder="Firstname"
            register={register}
          />
        </div>

        <div className={styles.form__input}>
          <Input
            label="Lastname*"
            name="lastname"
            type="text"
            placeholder="Lastname"
            register={register}
          />
        </div>
      </div>

      <div className={styles.form__input}>
        <Input
          label="Email*"
          name="email"
          type="email"
          placeholder="[email protected]"
          register={register}
        />
      </div>

      <div className={styles.form__row}>
        <div className={styles.form__input}>
          <Input
            label="Password*"
            name="password"
            type="password"
            placeholder="Password"
            register={register}
          />
        </div>
        <div className={styles.form__input}>
          <Input
            label="Confirm Password*"
            name="confPassword"
            type="password"
            placeholder="Confirm Password"
            register={register}
          />
        </div>
      </div>
    </React.Fragment>
  )
}

export function StepTwo({ currentStep, register }) {
  if (currentStep !== 2) {
    return null
  }

  return (
    <React.Fragment>
      <div className={styles.form__row}>
        <div className={styles.form__input}>
          <Input
            label="Address*"
            name="address"
            type="text"
            placeholder=""
            register={register}
          />
        </div>

        <div className={styles.form__input}>
          <Input label="City*" name="city" type="text" placeholder="" register={register} />
        </div>
      </div>

      <div className={styles.form__row}>
        <div className={styles.form__input}>
          <SelectInput label="State*" name="state" options={states} register={register} />
        </div>

        <div className={styles.form__input}>
          <Input
            label="Postal code"
            name="postalCode"
            type="text"
            placeholder=""
            register={register}
          />
        </div>
      </div>

      <div className={styles.form__input}>
        <Input
          label="Phone Number*"
          name="number"
          type="number"
          placeholder="Phone Number"
          register={register}
        />
      </div>
    </React.Fragment>
  )
}

export function StepThree({ currentStep, register }) {
  if (currentStep !== 3) {
    return null
  }

  return (
    <React.Fragment>
      <div className={styles.form__input}>
        <SelectInput
          label="Membership type*"
          name="memberType"
          options={[
            { code: 1, name: "Associate Membership" },
            { code: 2, name: "Full Membership" },
          ]}
          register={register}
        />
      </div>

      <div className={styles.form__input}>
        <CheckboxInput
          label="How do you identify yourself*"
          options={[
            { name: "author", value: "An Author" },
            { name: "illustrator", value: "An Illustrator" },
          ]}
          register={register}
        />
      </div>
    </React.Fragment>
  )
}

person Ojay    schedule 03.10.2020    source источник
comment
Если в какой-то момент компоненты шагов будут размонтированы, ссылка на регистр потеряет эти данные. При следующем нажатии кнопки попытайтесь восстановить эти данные. Не могли бы вы привести пример того, как вы выполняете эти шаги?   -  person lissettdm    schedule 03.10.2020
comment
Я только что добавил реализацию   -  person Ojay    schedule 03.10.2020
comment
при действии _next сохранить данные (зарегистрироваться) до изменения currentStep   -  person lissettdm    schedule 03.10.2020


Ответы (1)


Проблема здесь в этом коде ниже:

export function StepOne({ currentStep, register }) {
  if (currentStep !== 1) {
    return null
  }

  return (...);
}


export function StepTwo({ currentStep, register }) {
  if (currentStep !== 2) {
    return null
  }

  return (...);
}


export function StepThree({ currentStep, register }) {
  if (currentStep !== 3) {
    return null
  }

  return (...);
}

Как только вы нажмете следующую кнопку, вы перейдете к следующему шагу. StepOne component затем возвращает null, в результате чего дочерние компоненты отключаются и отменяют регистрацию ваших полей. .

Чтобы решить эту проблему, вы не должны отключать компоненты при переходе между шагами. Вы можете сделать это, скрыв компонент, когда не хотите его отображать. Поэтому попробуйте изменить свой код на этот:

export function StepOne({ currentStep, register }) {
  return (
    <div key={1} style={currentStep !== 1 ? { display: "none" } : {}}>
      ...
    </div>
  );
}


export function StepTwo({ currentStep, register }) {
  return (
    <div key={2} style={currentStep !== 2 ? { display: "none" } : {}}>
      ...
    </div>
  );
}


export function StepThree({ currentStep, register }) {
  return (
    <div key={3} style={currentStep !== 3 ? { display: "none" } : {}}>
      ...
    </div>
  );
}

Живая демонстрация

 Отредактируйте 64183942 / response-hook-form-only-registers-  the-step-three-form-data-in-multi-level-form

person NearHuscarl    schedule 03.10.2020