表单验证是确保用户输入符合特定规范的关键步骤。本文将通过React和React Native中的正则表达式验证,构建可复用的自定义输入组件,并以电话号码、信用卡和CVC码为例进行说明。
自定义输入组件的优势在于:
请确保已安装以下依赖项:
npm install react-hook-form zod @hookform/resolvers zod react-native-mask-input styled-components
下面是一个可复用的StyledInput组件:
import React from "react"; import { Controller, useFormContext } from "react-hook-form"; import { TextInputProps, View } from "react-native"; import styled from "styled-components/native"; const InputContainer = styled.View` width: 100%; `; const Label = styled.Text` font-size: 16px; color: ${({ theme }) => theme.colors.primary}; `; const InputBase = styled.TextInput` flex: 1; font-size: ${({ theme }) => `${theme.fontSizes.base}px`}; color: ${({ theme }) => theme.colors.primary}; height: ${({ theme }) => `${theme.inputSizes.base}px`}; border: 1px solid ${({ theme }) => theme.colors.border}; border-radius: 8px; padding: 8px; `; const ErrorMessage = styled.Text` font-size: 12px; color: ${({ theme }) => theme.colors.error}; `; interface StyledInputProps<TFieldValues extends Record<string, any>> extends TextInputProps { label: string; name: string; } export function StyledInput<TFieldValues extends Record<string, any>>({ label, name, ...inputProps }: StyledInputProps<TFieldValues>) { const { control, formState } = useFormContext<TFieldValues>(); const { errors } = formState; const errorMessage = errors[name]?.message; return ( <InputContainer> <Label>{label}</Label> <Controller control={control} name={name} render={({ field: { onChange, onBlur, value } }) => ( <InputBase value={value} onChangeText={onChange} onBlur={onBlur} {...inputProps} /> )} /> {errorMessage && <ErrorMessage>{errorMessage}</ErrorMessage>} </InputContainer> ); }
React代码逻辑相同,只需将TextInput替换为HTML的元素,并调整样式。
为电话号码和信用卡等输入定义掩码和验证器:
import * as zod from "zod"; import { mask } from "react-native-mask-input"; //仅在React Native中使用 const turkishPhone = { mask: ["+", "(", "9", "0", ")", " ", /\d/, /\d/, /\d/, " ", /\d/, /\d/, /\d/, "-", /\d/, /\d/, "-", /\d/, /\d/], //仅在React Native中使用 validator: /^\+\(90\) \d{3} \d{3}-\d{2}-\d{2}$/, placeholder: "+(90) 555 555-55-55", }; const creditCard = { mask: [/\d/, /\d/, /\d/, /\d/, "-", /\d/, /\d/, /\d/, /\d/, "-", /\d/, /\d/, /\d/, /\d/, "-", /\d/, /\d/, /\d/, /\d/], //仅在React Native中使用 validator: /^\d{4}-\d{4}-\d{4}-\d{4}$/, placeholder: "4242-4242-4242-4242", }; const cvc = { mask: [/\d/, /\d/, /\d/], //仅在React Native中使用 validator: /^\d{3}$/, placeholder: "123", }; const schema = zod.object({ phone: zod.string().regex(turkishPhone.validator, "无效的电话号码"), creditCard: zod.string().regex(creditCard.validator, "无效的信用卡号码"), cvc: zod.string().regex(cvc.validator, "无效的CVC码"), });
使用react-hook-form和zod进行验证:
import { FormProvider, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { StyledInput } from "./StyledInput"; //导入自定义组件 export default function FormScreen() { const form = useForm({ resolver: zodResolver(schema), mode: "onBlur", }); return ( <FormProvider {...form}> <form onSubmit={form.handleSubmit((data) => console.log(data))}> <StyledInput label="电话号码" name="phone" {...turkishPhone} /> {/* React Native: 使用mask属性 */} <StyledInput label="信用卡号码" name="creditCard" {...creditCard} /> {/* React Native: 使用mask属性 */} <StyledInput label="CVC码" name="cvc" {...cvc} /> {/* React Native: 使用mask属性 */} <button type="submit">提交</button> </form> </FormProvider> ); }
通过创建可复用的自定义输入组件并结合正则表达式验证,可以显著简化表单处理流程,并确保应用程序的一致性。这些组件在React和React Native中都能良好运行,并提供更佳的用户体验。 您可以根据应用需求自定义掩码、验证器和样式。 祝您编码愉快!
以上就是在 React 和 React Native 中为正则表达式验证创建自定义输入的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号