💡 如果还不了解 HTML 、 CSS和JS,可以参考本号下的 HTML21 天入门教程、 CSS 21 天入门教程和JS21天入门教程。
表单处理一直是 web 应用的重中之重,今天来看一下 react 如何处理表单。
从处理方式来看,有两种选择,一是将表单处理交给 React,另一种则是自己来处理。
这两种方式都离不开 react 本身实现的支持。
且对于自己来处理,可以使用第三方提供的组件,比如 react-hook-form 获得更多的便利。
useState 和 useRef
表单的处理,离不开 react 的两个 hook: useState 和 useRef。
useState
前面介绍过,useState 用来管理状态。
在表单中,表单控件的状态则可以通过 useState 来进行管理。
以注册表单为例,如下:
import React, { useState } from 'react'; function RegisterForm() { const [mailValue, setMailValue] = useState(''); const [passwordValue, setPasswordValue] = useState(''); //如果有更多的表单控件 const handleSubmit = () => { // 提交表单 }; const handleInputChange = (e) => { setMailValue(e.target.value); setPasswordValue(e.target.value); //如果有更多的表单控件 }; return ( <div> <input value={mailValue} onChange={handleInputChange} /> <input value={passwordValue} onChange={handleInputChange} /> {/* 如果有更多的表单控件 */} <button onClick={handleSubmit}>Submit</button> </div> ); } export default RegisterForm;
这里通过 useState 对 name 和 mail 控件进行了状态管理。
如果表单中有其它的控件,则按原样增加相应的处理代码。
上述代码中的表单处理就交给 react 了,这样创建出来的表单控件也被称为 受控组件。
useRef
如果想要自己控制,则不能使用状态来管理控件,这里就要使用 useRef,仅仅用于获取值。
import React, { useRef } from 'react'; function RegisterFormNew() { const mailRef = useRef(null); const passwordRef = useRef(null); const handleSubmit = () => { const mailValue = passwordRef.current.value; const passwordValue = passwordRef.current.value; // 提交表单 console.log({ mailValue, passwordValue }); }; return ( <div> <input ref={mailRef} /> <input ref={passwordRef} /> <button onClick={handleSubmit}>Submit</button> </div> ); } export default RegisterFormNew;
上述代码中,使用了 useRef,通过它能获取到控件当前的值,但也仅此而。
这样实现的控件,也被称为非受控件组件,意思是不受 react 的控制。
既然不受 react 控制,也就意味着自己可以写代码对表单进行处理。
当然现实情况下,不用自己从头写,借助于强大的第三方组件,可以轻松实现对表单的处理。
react-hook-form
这里介绍一个轻便的控件 react-hook-form,对上述代码进行修改之后如下。
import React from 'react'; import { useForm } from 'react-hook-form'; const RegisterFormNewHook = () => { const { register, handleSubmit, formState: { errors }, } = useForm(); const onSubmit = (data) => { console.log(data); }; return ( <form onSubmit={handleSubmit(onSubmit)}> <input name="email" {...register({ required: '请输入邮箱。' })} /> {errors.email && <p>{errors.email.message}</p>} <input name="password" type="password" {...register({ required: '请输入密码。' })} /> {errors.password && <p>{errors.password.message}</p>} <button type="submit">提交</button> </form> ); }; export default RegisterFormNewHook;
为了展示这个组件的功能,写了一点验证在里面。
但即使是这样,也能看到代码非常的简洁和易懂。
总结
最后来总结一下今天的内容要点:
- 🍑 使用 useState 把表单交给 react 来处理,称为受受控组件。
- 🍑 使用 useRef 对表单进行处理,称为非受控组件。
- 🍑 第三方组件 react-hook-form 使用了钩子方式提供了完善的表单处理。
该文章在 2024/12/12 10:43:11 编辑过