首页 > 其他分享 >在 React 中无压力地创建表单

在 React 中无压力地创建表单

时间:2022-08-31 03:22:06浏览次数:91  
标签:验证 创建 表单 React 使用 组件 钩子

在 React 中无压力地创建表单

管理验证、错误、修改字段列表等的简单方法

Photo by 泰勒尼克斯 on 不飞溅

老实说,有很多方法可以管理表单的状态。现在我们有很多选择。 甲酸 , 反应钩子形式 , 和 反应最终形式 是最受欢迎的。

哦,你可以制作你的自定义钩子。这里最具挑战性的部分是为您的项目选择正确的选项。

我的故事

几年前,我正在研究在 React 中管理表单,寻找最适合我的解决方案。我想找到一种简单而美观的方法来管理验证和错误,保留访问字段列表等等。

那么它做了什么?我创建了我的自定义钩子!

是的,我喜欢编码,我喜欢创建我的解决方案。这是一个简单的钩子,使用[ 用户减速器](https://reactjs.org/docs/hooks-reference.html) 下面来管理表单的状态。表单中的每次击键都会更新更改(我们都知道 React 行为是正常的)。

我在那里没有任何花哨的验证,仅在提交时检查数据,并且一切正常,但是……

问题

表现!一开始我并没有感觉到。我以多种形式使用我的钩子,一切都很棒,但我的形式增长了;我有很大的嵌套对象,所以我不得不做一些魔术[ 使用备忘录](https://reactjs.org/docs/hooks-reference.html#usememo) ,[ 使用回调](https://reactjs.org/docs/hooks-reference.html#usecallback) ,以及正确的构图,这有帮助,但是……

我意识到我的解决方案太简单了。我需要更多。我想快速检测表单中是否进行了任何更改,更改了哪些字段等等。我可能可以改进我的钩子并使它更“聪明”,但这需要我更多的努力和时间。如果没有现有的解决方案,那很好,但事实并非如此。

不要误会我的意思。我不是在谈论基本表单,其中您有一个或两个输入字段和一个按钮。您可以轻松地生活,无需任何图书馆。

我明白我不想把时间浪费在解决这些问题上;我只是想找到一个可以做所有这些事情的库,并且不应该对表单的每一次更改都进行重新渲染。

我开始学习现有的解决方案。

寻找答案

那个时候,最受欢迎的是Formik。如果我们现在查看官方文档,我们可以看到它仍然是推荐的方式之一。

如果您正在寻找一个完整的解决方案,包括验证、跟踪访问的字段和处理表单提交,Formik 是受欢迎的选择之一。但是,它建立在受控组件和管理状态的相同原则之上——所以不要忽视学习它们。

但正如我之前提到的,我不想在每次更改时重新呈现我的表单。在阅读文档和实验之后,我选择了 React Hook Form。

为什么选择 React Hook 形式?

  1. 使用 useRef 可以提高性能。您可以在 官方文档 .
  2. 您可以使用 Yup 进行验证。
  3. 带有大量示例的优秀文档。
  4. 您可以注册不受控制的组件或使用来自 react-hook-form 的 Controller 控制,这允许您使用库中的组件,例如 材料界面 , 蚂蚁Td , 流畅的用户界面 , 和别的。
  5. 图书馆使用[ 使用上下文](https://reactjs.org/docs/hooks-reference.html#usecontext) 钩子,因此您可以将方法传递给深度嵌套的孩子。
  6. 如果您对钩子感到满意,RHF 语法看起来会非常熟悉且易于理解。

当我开始使用这个库并看到它时,我感受到了不同 反应探查器 .查看组件重新渲染的频率以及原因会很有帮助。有时它可以帮助解决性能问题。

使用是的

我之前提到过我需要管理验证,所以我使用了 Yup。这是一种验证数据的绝妙方法,因为您可以独立使用它或与其他库一起使用它来管理状态。

yup 很容易用于定义验证;你有很多不同的类型,你可以描述依赖关系和你的验证规则。在我的示例中,我提交了“姓氏”,当字段的标题值为“测试”时,这是必需的。看看这个例子,你会发现使用 Yup 是多么简单:

使用 React Hook 表单

使用 FluentUI、MaterialUI 或其他库中的组件有助于选择使用受控组件。是的,我不想使用它们,但 React Hook Form 允许我使用受控组件,从而最大限度地减少渲染。不幸的是,我不能不受控制地使用一些 FluentUI 组件,所以 RHF 帮助优化性能真是太棒了。

好的,但是如何使用这个库呢?

首先,我们需要安装两个包: npm install react-hook-form 是的 .我们可以传递默认值并说明我们希望多久验证一次表单。

然后我们需要决定我们将使用什么类型的组件。我们在这里有两个选择:

  1. 注册不受控制的组件
  2. 使用名为的包装器 控制器 用于受控组件

对于第二个选项,您需要用 控制器 来自 RHF。这是我的例子 文本域 来自 FluentUI 库。

最好的是,如果需要,我们可以将两种选择结合起来,并以一种形式使用两种方式。这是我的受控组件示例:

这是最终结果 - 快速而轻松。

这就是使用 React Hook Form 和 Yup 在 React 中管理表单状态的全部内容。我希望这些库也能帮助你。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/2016/19063103

标签:验证,创建,表单,React,使用,组件,钩子
From: https://www.cnblogs.com/amboke/p/16641571.html

相关文章

  • 构建 React Monorepo 的 5 种方法
    构建ReactMonorepo的5种方法构建生产级Reactmonorepo的最佳工具:从快速构建到代码共享和依赖关系。今天比以往任何时候都更需要一个支持React应用程序系统开发......
  • 如何创建前端 WebGPU 项目?
    目录1.丐版HelloWebGPU①为什么是index.html②你这个代码为什么浏览器没有显示东西?③为什么你不用HTTP协议打开index.html2.我需要类型提示2.1.使用VSCode的......
  • vue3 基础-表单元素双向绑定
    通常是在form表单相关的场景中会用到双向绑定相关,核心是v-model的应用.input输入框<!DOCTYPEhtml><htmllang="en"><head><title>input</title><script......
  • new的工作原理、new和字面量创建对象的区别
    new的工作原理:1.创建一个空对象,构造函数中的this会指向这个对象2.这个新对象会被链接到原型3.执行构造函数方法,其属性和方法都会被添加到this引用的对象中4.如果构造函......
  • React报错之Property does not exist on type 'JSX.IntrinsicElements'
    正文从这开始~总览当组件名称以小写字母开头时,会导致"Propertydoesnotexistontype'JSX.IntrinsicElements'"错误。为了解决该错误,确保组件名称总是以大写字母开头,......
  • ElasticSearch7创建index时指定type问题
    项目背景最近在某项目开发中遇到一个高版本ES创建索引时指定index和type问题。项目中的ES使用了阿里云上的ES,版本为7.4。通过ES官网对各版本type的演变如下:在5.X版本......
  • numpy基本属性,numpy创建array
    基本属性importnumpyasnparray=np.array([[1,2,3],[4,5,6]])array.dtype返回矩阵的数据类型array.ndim返回该矩阵是几维的array.size返回矩阵的大小(元素的......
  • 优雅创建List或者Map的方式
    List创建空List:Collections.emptyList();创建单个元素的List:Collections.singletonList("item");但是需要注意,上面两种创建方式创建出来的List都是不可变List,创建可......
  • Dataset与DataFrame创建的比较方式
    DataFrameDataset创建方式1.根据集合或者RDD的隐式函数toDF(列名)创建(需要引入SparkSession的隐式转换函数)2.SparkSession的createDataFrame函数3.外部结构化......
  • react-native-svg 使用
    github:https://github.com/react-native-svg/react-native-svg安装: [email protected]注意:如果运行yarnandroid报错Task......