使用 Yup 和 Formik 在 React Forms 中实现内联字符限制验证

使用 Yup 和 Formik 在 React Forms 中实现内联字符限制验证
使用 Yup 和 Formik 在 React Forms 中实现内联字符限制验证

掌握 Formik 表单中字符限制的内联验证

使用表单 反应 通常可能涉及管理精确的验证规则,特别是在使用像这样的库时 福米克是的。开发人员面临的一种常见情况是对输入字段设置字符限制,例如将描述或文本区域限制为 250 个字符。

虽然添加最大字符限制似乎很简单,但在超过该限制时启用内联验证错误可能会带来挑战。例如,像 maxLength 这样的标准 HTML 属性会阻止用户输入超出限制的内容,但这会绕过 是的验证,需要注册第251个字符才能触发错误消息。

在这种情况下,在阻止输入和提供实时反馈之间取得适当的平衡可能很棘手。使用设置额外限制或依赖场模糊事件等解决方法通常会导致响应速度降低或错误处理不直观。

在本指南中,我们将探索一种方法来实现立即内联验证,而不依赖于 最大长度。通过使用 福米克是的,我们将启用自定义验证规则,在超出字符限制时显示实时错误消息,为用户提供无缝体验。 🚀

命令 使用示例
setFieldValue 用于以编程方式更新 Formik 中特定表单字段的值。在这里,它会在键入字符时动态更新描述字段,从而实现实时字符计数。
setFieldTouched 此命令手动设置表单字段的“触摸”状态。在此脚本中,当字符数超过 250 时触发,从而启用 Yup 验证反馈,而无需用户模糊输入字段。
validationSchema 向 Formik 指定 Yup 验证规则。在这里,它通过将descriptionValidation模式直接集成到表单的配置中来强制执行250个字符的限制。
Yup.string().max() 是的,用于定义字符串最大长度约束的验证方法。在此脚本中,它将描述字段限制为 250 个字符,如果超出则显示错误。
ErrorMessage 当验证失败时,在 Formik 中显示内联错误消息。在这里,它使用 Formik 的错误处理来在超出字符限制时立即显示消息。
inputProps 定义 Material-UI 中 TextField 的附加属性。此命令设置最大行数或字符限制等属性,影响字段的行为和显示方式。
express.json() Express.js 中的中间件用于解析传入的 JSON 有效负载。在后端验证脚本中,该命令使服务器能够解析和处理req.body中的JSON数据。
descriptionSchema.validate() 在服务器端应用 Yup 验证规则。在后端脚本中,它根据字符限制约束检查传入数据,并根据验证成功或失败发送响应。
helperText TextField 中的 Material-UI 属性,允许在字段下自定义帮助程序消息。在这种情况下,它会显示剩余字符数或验证错误,从而增强用户体验。
ErrorMessage component="div" 用于自定义 Formik 中错误消息的呈现。通过将其设置为 div,此命令可以控制验证消息的格式和外观。

使用 Formik 和 Yup 实施内联验证以获得实时反馈

此处提供的 React 脚本旨在对 Formik 表单中的字符限制文本字段实现实时内联验证。此设置使用 福米克 方便表格处理和 是的 用于定义验证模式。主要挑战在于,像 maxLength 这样的标准 HTML 输入属性会阻止用户直接超出字符限制,这限制了我们触发 Yup 的验证。因此,我们以编程方式检查字符数并更新 Formik 感动 超过限制时的状态。这种方法允许用户在达到 251 个字符时立即看到验证消息,而不是等待他们离开字段。 🚀

第一个脚本展示了福米克的一种方法 设置字段值设置触摸字段 命令用于控制输入的行为。在这里,当用户键入时,Formik 的 onChange 处理程序会动态更新 描述 字段,允许字符数增加到 251。一旦计数超过 250,就会触发 setFieldTouched 将字段标记为“已触摸”,这会激活 Yup 的验证,并内联显示一条错误消息。这种即时反馈对于确保用户立即收到通知、增强可用性和减少错误至关重要。想象一下填写在线申请表,其中即时反馈可以帮助您知道是否需要编辑您的回复,而无需等待提交错误。 👍

第二种方法完全删除 maxLength 属性,仅依赖于编程字符计数验证。在此版本中,onChange 事件处理程序发挥主动作用,确保如果字符数低于或等于 250,则字段值正常更新。如果输入达到 251 个字符阈值,则输入不会阻止多余的字符,而是将该字段标记为已触摸。这保持了无缝的打字体验,没有硬性限制,提供了一种更柔和的方式来处理溢出。 helperText 还充当实时字符计数器,帮助用户在键入时跟踪剩余字符,这在字符限制严格时(例如在社交媒体 BIOS 或消息框中)非常有用。

最后,后端解决方案利用 Express 和 Yup 来验证服务器端的输入长度,这有助于提高安全性或在使用 API 端点时。服务器解析传入的 JSON 数据,根据 Yup 架构对其进行验证,然后确认验证成功或以错误消息进行响应。这一层验证有助于防范可能绕过客户端检查的情况,确保输入的长度不会超过 250 个字符,无论其来自何处。在前端和后端使用分层验证是安全应用程序开发的最佳实践,因为它提供了针对绕过尝试的弹性,使其成为生产环境的绝佳选择。这样,如果任何客户端验证无法激活或被规避,后端仍将捕获并处理错误,从而保护数据完整性。

使用 Formik、Yup 和 TypeScript 在 React 表单中实现内联验证

解决方案 1:使用 Yup 字符限制验证来响应前端表单

import React from 'react';
import { Field, Formik, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';
import TextField from '@material-ui/core/TextField';
// Define the validation schema with Yup, setting max length
const descriptionValidation = Yup.string()
  .max(250, 'Description cannot exceed 250 characters')
  .optional();
// Function component
const DescriptionForm = () => {
  return (
    <Formik
      initialValues={{ description: '' }}
      validationSchema={Yup.object({ description: descriptionValidation })}
      onSubmit={(values) => console.log('Submitted', values)}
    >
      {({ errors, touched, setFieldValue, setFieldTouched }) => (
        <Form>
          <Field
            as={TextField}
            name="description"
            label="Description"
            multiline
            rows={4}
            placeholder="Optional"
            error={Boolean(errors.description && touched.description)}
            helperText={
              errors.description && touched.description
                ? errors.description
                : 'Limit: 250 characters'
            }
            onChange={(event) => {
              const { value } = event.target;
              setFieldValue('description', value);
              if (value.length > 250) {
                setFieldTouched('description', true);
              }
            }}
          />
          <ErrorMessage name="description" component="div" className="error" />
        </Form>
      )}
    </Formik>
  );
};
export default DescriptionForm;

没有 maxLength 属性的替代内联验证

解决方案 2:在不阻止输入的情况下通过手动字符长度验证做出反应

import React from 'react';
import { Field, Formik, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';
import TextField from '@material-ui/core/TextField';
// Yup schema for 250-character limit
const descriptionValidation = Yup.string()
  .max(250, 'Description cannot exceed 250 characters')
  .optional();
// Component definition
const DescriptionForm = () => {
  return (
    <Formik
      initialValues={{ description: '' }}
      validationSchema={Yup.object({ description: descriptionValidation })}
      onSubmit={(values) => console.log('Form Submitted:', values)}
    >
      {({ errors, touched, setFieldValue, setFieldTouched, values }) => (
        <Form>
          <TextField
            name="description"
            label="Description"
            multiline
            rows={4}
            placeholder="Optional"
            value={values.description}
            error={Boolean(errors.description && touched.description)}
            helperText={
              errors.description && touched.description
                ? errors.description
                : `Characters left: ${250 - values.description.length}`
            }
            onChange={(event) => {
              const { value } = event.target;
              if (value.length <= 250) {
                setFieldValue('description', value);
              } else {
                setFieldTouched('description', true);
              }
            }}
          />
          <ErrorMessage name="description" component="div" className="error" />
        </Form>
      )}
    </Formik>
  );
};
export default DescriptionForm;

使用 Express.js 和 Yup 进行后端验证字符限制

解决方案 3:使用 Node.js 与 Express 和 Yup 进行后端验证

const express = require('express');
const app = express();
const Yup = require('yup');
// Middleware for JSON parsing
app.use(express.json());
// Define Yup schema
const descriptionSchema = Yup.object().shape({
  description: Yup.string()
    .max(250, 'Description cannot exceed 250 characters')
    .optional(),
});
// POST route with validation
app.post('/submit', async (req, res) => {
  try {
    await descriptionSchema.validate(req.body);
    res.status(200).json({ message: 'Validation Passed' });
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});
// Server setup
app.listen(3000, () => console.log('Server running on port 3000'));

扩展 Formik 和 React 中的内联验证技术

当使用 Formik 和 Yup 在 React 中实现内联验证时,标准 onChange 验证的一种替代方法是使用自定义 debounce 函数。通过消除输入抖动,您可以延迟验证检查,直到用户暂停输入一段设定的时间,从而创造更流畅的体验。这可以防止验证错误过早或意外出现,当用户在字符限制较高的字段中输入长响应时特别有用。通过使用去抖 onChange,开发人员可以减少不必要的验证,这可以改善 表现 和用户体验,尤其是在速度较慢的设备或大型表单上。想象一下,在长表单中输入您的详细信息,只有在您暂停后才会看到错误消息弹出,这感觉不会那么分散注意力。

另一种方法涉及利用福米克的 字段数组 对于可能需要类似验证的动态字段,例如注释或注释列表,其中每个字段都有自己的字符限制。借助 FieldArray,每个输入都可以维护自己独立的字符计数器和验证状态,从而简化复杂的表单。您可以使用 Formik 设置每个字段以显示实时验证消息 setFieldTouched 和 Yup 的最大验证器。例如,如果用户需要添加多个简短注释,FieldArray 可以轻松应用和管理每个条目的验证限制,显示特定于每个注释的内嵌错误。

在某些情况下,将 Formik 的验证与本机 JavaScript 方法相结合可以实现更精细的控制。例如,使用 substring 方法,您可以在验证触发之前动态地将输入文本修剪为所需的长度。当输入满足精确标准至关重要时,例如限制推文或 SMS 长度文本消息的输入时,此方法非常有用。通过将 Formik 与 substring 等 JavaScript 函数相结合,开发人员可以拥有更广泛的选项来控制用户体验和数据完整性,确保文本始终在可接受的范围内,而无需手动编辑或表单重置。

有关 Formik 和 Yup 中内联验证的常见问题

  1. 主要使用目的是什么 Formik 是的进行验证?
  2. Formik 和 Yup 的组合简化了 React 应用程序中的表单处理和验证,特别是对于较大的表单或具有复杂验证需求的表单。 Formik 管理表单状态,而 Yup 处理验证模式。
  3. 怎么样 setFieldTouched 不同于 setFieldValue 在福米克?
  4. setFieldTouched 更新字段的“触摸”状态,将其标记为已交互以进行验证目的,同时 setFieldValue 直接更新字段的值。它们共同帮助管理验证发生的时间和方式。
  5. 我可以同时使用本机吗 maxLength 是的验证?
  6. 使用 maxLength 限制前端的输入长度,但可能会阻止 Yup 的验证触发内联错误。如果需要内联验证,请考虑删除 maxLength 并依赖 Yup 和 Formik 的 onChange 处理程序。
  7. 我为什么要使用 FieldArray 在 Formik 中进行验证?
  8. FieldArray 允许开发人员处理动态表单,其中多个字段遵循类似的验证规则,使其成为评论或标签等每个条目都有特定要求的项目列表的理想选择。
  9. 什么是去抖函数,为什么将其与 Formik 验证一起使用?
  10. 去抖动是一种延迟验证直到用户暂停键入的技术,从而减少过多的验证调用。它对于较长的文本字段特别有用,可以防止过早的验证消息可能分散用户的注意力。
  11. 使用 Yup 验证多个字段的最佳实践是什么?
  12. 使用是的 objectarray 架构来定义复杂的验证,并应用自定义错误消息以明确哪些字段不满足要求。
  13. 如何动态向用户显示剩余字符?
  14. 使用 helperText Material-UI 中的 TextField 组件允许实时字符计数显示,这可以通过帮助用户跟踪其剩余输入容量来提高可用性。
  15. 后端验证可以用 Yup 代替前端验证吗?
  16. 后端验证对于数据完整性至关重要,但前端验证可以向用户提供即时反馈,从而改善他们的体验。建议使用两者来安全且用户友好地处理数据。
  17. 去掉有什么好处 maxLength 内联验证的属性?
  18. 去除 maxLength 使 Formik 和 Yup 能够完全控制验证过程,一旦超出字符限制就允许显示内联错误,而无需直接限制输入长度。

关于实时内联验证的最终想法

使用 Formik 和 Yup 实施内联验证可为字符限制字段提供更流畅、更具交互性的用户体验。通过删除 最大长度 并使用福米克的 设置触摸字段 从策略上讲,用户可以获得即时反馈,而不会受到硬性限制的干扰。该技术非常适合应用程序或生物领域等场景。

这种方法提供了灵活性,并且可以进一步定制以满足特定需求。字符限制的内联验证可确保数据一致性和用户友好的体验,特别是在管理多个基于字符的字段时。通过结合 FormikYup 和 JavaScript,开发人员可以为用户提供直观且强大的验证。 🚀

有关内联验证技术的资料来源和进一步阅读
  1. 提供全面的概述 福米克 以及 React 中的验证处理技术。 福米克文档
  2. 详细使用 是的 作为模式验证工具,对于管理输入约束特别有用。 是的 GitHub 存储库
  3. 讨论实施的最佳实践 内联验证 在现代前端框架中,重点是 React。 Smashing Magazine:表单验证用户体验
  4. 使用 Formik 探索动态现场验证 设置触摸字段 以及如何将其应用于内联错误。 ReactJS 文档:表单