react-hook-form 只以多级形式注册最后一步的表单数据

2024-03-13

我使用这个 css-tricks 构建了一个多级表单article https://css-tricks.com/the-magic-of-react-based-multi-step-forms/我正在尝试使用验证表单react-hook-form,但是react-hook-form只看到步骤 3 输入数据,我需要从步骤 1 到步骤 3 的所有输入数据,以便我可以验证并发送到服务器。这是一个简单的网络应用程序注册表单。

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] /cdn-cgi/l/email-protection"
          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>
  )
}

这里的问题是在下面的代码中:

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然后组件返回null这使得子组件卸载并且注销 https://react-hook-form.com/advanced-usage/#ConditionalControlledComponent你的领域。

要解决此问题,在步骤之间跳转时不得卸载组件。当您不想显示该组件时,可以通过隐藏该组件来实现此目的。所以尝试将您的代码更改为:

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>
  );
}

现场演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react-hook-form 只以多级形式注册最后一步的表单数据 的相关文章

随机推荐

  • 紧凑框架 - OpenNetCf.Net FTP 示例?

    我正在尝试让 OpenNetCF Net FTP 组件与我的 PDA 应用程序一起工作 除了连接到服务器之外 我正在努力让它做更多的事情 并且想知道是否有人知道我可以用来学习如何使用它的任何示例代码 我需要能够下载和上传文件 以及确定我想要
  • 使用 FLoginView 登录 facebook 未在 ios 6 中显示

    我正在尝试使用 FLoginView 创建 facebook 的登录按钮 以下是我写的代码 void viewDidLoad super viewDidLoad if loginview loginview FBLoginView allo
  • 与 PFX 文件合并

    VS2012 似乎使用 PFX 文件而不是 SNK 文件进行签名 我的印象是这与延迟签名有关 但我不在乎 当我构建应用程序时 我可以使用 an to 并查看它是否已签名 当我合并调试文件夹并使用 keyfile 指令 我成功地处理 SNK
  • 如何使用 Grails 4 JSON 视图呈现域对象的映射

    这是以下问题 如何将映射呈现为 Grails 4 JSON 视图中的属性 https stackoverflow com q 69322504 715608 我有以下 JSON 视图 我想渲染以下值mealsByPerson地图使用 bre
  • 是否可以创建圆形(或任何其他非矩形)图像?

    我看到的所有圆盘形图像实际上都在一个矩形框内 并且侧面 下图中的黑色部分 是透明的 是否有可能拥有圆形画布本身 或者图像总是被设计成矩形 If yes how 你是对的 任何非矩形图形确实都存在于与轴对齐的边界矩形内 这样做是因为矩形处理起
  • Codemirror 显示 HTMLLint 内联错误 (.addLineWidget)

    我一直在尝试让 HTMLHint 显示内联而不是 JSHint 使用 addLineWidget http codemirror net doc manual html addLineWidget Codemirror 提供了我尝试使用 J
  • 将 JSON 发布到控制器返回 400 Bad Request

    我正在开发 RESTful 服务 我无法将 JSON 数据发布到控制器 我正在使用以下依赖项 春季 3 2 3 发布 杰克逊 1 9 6 我也尝试过 Spring 3 2 3 RELEASE 与 Jackson 1 9 9 Spring 3
  • wp print_thumbnail 功能不起作用

    wordpress 打印缩略图功能在测试服务器上正常工作 但在在线服务器上无法工作并给出错误的图像路径 例如 var www vhosts vinehospitality co za httpdocs wp content uploads
  • 一个意料之外的问题发生了。 WordPress.org 可能有问题

    我无法在我的 WordPress 网站中安装插件 当我尝试安装新插件时 出现以下错误 但它允许我上传插件然后安装它 发生意外错误 WordPress org 或此服务器的配置可能有问题 如果问题仍然存在 请尝试支持论坛 花了更多时间后 我通
  • 用于键盘输入的简单 UIToolarAccessoryView 的布局约束错误

    我遇到了很多布局约束错误 因此我创建了一个新项目 并仅使用 UIToolbar 和 UITextField 来尝试解决问题 即使有一个干净的项目 即使我没有覆盖任何限制 我仍然会遇到奇怪的错误 inputAccessoryView 代码如下
  • Yocto 添加自定义 UBoot 环境变量

    我正在尝试通过 Yocto 构建过程添加两个新的 u boot 环境变量 My file u boot imx 2021 04 bbappend包含 FILESEXTRAPATHS prepend THISDIR PN SRC URI fi
  • 如何制作Java插件?

    如果我想让我的Java程序能够接受插件 我怎样才能让Java插件使用核心程序的类而不将所有代码包含到插件代码中 插件如何访问程序界面而不将其包含到自己的 jar 文件中 看看Java插件框架 http jpf sourceforge net
  • 有没有办法暂停核心动画并在稍后恢复它?

    我有几个核心动画同时进行 它们都有一个上下文和一个动画 ID 其中上下文是正在动画的对象 UIImageView 对象 我想暂停它们 以便动画暂时停止 然后当某些事情完成时 恢复它以完成它 这些事情仅发生在 UIScrollView 中非常
  • 在 javascript 中启用/禁用 asp 验证控制

    我希望使用 JavaScript 启用 禁用我的验证控件 当我单击单选按钮列表 是 否 时 2 3 行变得可见 单击 是 后 用户必须在该行中提供的文本框中输入内容 为此 我保留了需要字段验证器 我在页面加载时禁用所有这些 然后使用 Val
  • Powershell:捕获无法启动服务时引发的异常

    我似乎无法捕获抛出的异常Start Service 这是我的代码 try start service SomeUnStartableService catch Microsoft PowerShell Commands ServiceCom
  • ASP.net 不使用其他区域设置资源文件

    我有一个Default aspx我获取本地化值的文件 默认 aspx
  • IgnoreMissingMember 设置似乎不适用于 FSharpLu.Json 反序列化器

    这是以下内容 F 中 json net 的反序列化问题 https stackoverflow com questions 62360805 deserialization issue with json net in f 我正在反序列化一
  • 在java中向下舍入0.5

    如何实现一个舍入函数 将除 0 5 或其任何奇数倍之外的所有数字照常舍入到最接近的整数 例如 2 899是要四舍五入到3 0 2 332是要向下舍入到2 0 2 5也将向下舍入为2 0 并不是3 0 您可以使用BigDecimal如下 pu
  • 如何检查数组列表中的数字是否连续

    我想检查数组列表中的数字是否是连续的 数组中的数字从 1 开始 下一个元素应该是 2 3 和 4 这意味着下一个元素比前一个元素大 1 public static void main String args ArrayList
  • react-hook-form 只以多级形式注册最后一步的表单数据

    我使用这个 css tricks 构建了一个多级表单article https css tricks com the magic of react based multi step forms 我正在尝试使用验证表单react hook f