react入门—实现复杂表单方法的封装以及表单验证功能的实现(表单验证方法的封装优化)

简介: 在前端开发中,表单验证是很常见的功能,这边文章就来讲一下react入门实现复杂表单的功能,以及表单验证功能的实现

前言

在前端开发中,表单验证是很常见的功能,这边文章就来讲一下react入门实现复杂表单的功能,以及表单验证功能的实现

复杂表单页面的实现

实现一个表单页面,包含输入框,单选框和下拉框,点击提交能够拿取输入的数据
1.首先定义我们的非受限组件Hello,并在state中定义我们需要用到的变量:

class Hello extends React.Component {
            state = {
                name: '',
                sex: '2',
                select: 'A',
                select2: '',
                select3: '',
                text: 'hello world'
            }
        }

2.然后在组件中来写我们的render()方法:
先把上面定义的state进行结构,定义arr1数组用来存放下拉框需要的数据,arr2是一个数组对象,里面也是我们实际开放中最常用的格式,用来渲染另一个下拉框
然后在return中开始写页面的内容

render() {
    let { name, sex, select, select2, select3, text } = this.state
    let arr1 = ['D', 'E', 'F', 'G', 'H']
    let arr2 = [{id: 1, color: 'red'}, {id: 2, color: 'green'}, {id: 3, color: 'blue'}]
    return <div>
        <form>
            <label>姓名:<input type="text" name="name" defaultValue={name} onChange={this.handleChange} /></label><br/>
            <label>性别:
                <input type="radio" name='sex' value="1"
                defaultChecked={sex === '1' ? true : false}
                onChange={this.handleChange}/>男
                <input type="radio" name='sex' value="2"
                defaultChecked={sex === '2' ? true : false}
                onChange={this.handleChange}/>女
            </label><br/>
            <label>写死的选项:
                <select name="select" defaultValue={select} onChange={this.handleChange}>
                    <option value="A">A</option>
                    <option value="B">B</option>
                    <option value="C">C</option>
                    <option value="D">D</option>
                </select>
            </label><br/>
            <label>循环遍历出来的选项:
                <select name="select2" defaultValue={select2} onChange={this.handleChange}>
                    {
                        arr1.map((item, index) =>
                            <option key={index} value={item}>{item}</option>
                        )
                    }
                </select>
            </label><br/>
            <label>数组中是对象的数据循环遍历处理:
                <select name="select3" defaultValue={select3} onChange={this.handleChange}>
                    {
                        arr2.map(item =>
                            <option key={item.id} value={item.id}>{item.color}</option>
                        )
                    }
                </select>
            </label><br/>
            <label>备注信息:
                <textarea name="text" defaultValue={text} onChange={this.handleChange}></textarea>
            </label>
        </form>
        <button onClick={this.handleSubmit}>点击提交</button>
    </div>
}

在上面的select中,我们使用循环讲arr1中的内容展现出来,第二个select中是对数组中对象的数据循环遍历的处理方式,注意观察他们的写法不同

3.给每个输入框添加onChange事件,给button按钮添加onClick事件提交表单
下面来写一下这个两个函数:
handleChange是输入框值改变就触发的时间,我们通过给每个元素绑定name值,然后封装起来,注意这里this.setState里面是[name],数组的形式,e.target.value拿到输入的值并赋值
handleSubmit是将表单的值提交,然后打印出来

handleChange = (e) => {
    let name = e.target.name
    this.setState({[name]: e.target.value})
}
handleSubmit = () => {
    console.log(this.state)
}

效果展示:

在这里插入图片描述

表单验证方法

下面来讲在表单中加入表单验证如何写,这里就不用上面的那个表单,写一个新的表单包含昵称,密码,手机号,主要来看看怎么实现表单验证:

再输入框后面加上span标签,用来展示错误提示信息,里面绑定对应的错误信息如{nameError}

return <div>
    <form>
        <label>姓名:<input type="text" name="name"
            defaultValue={name} onChange={this.nameChange} />
            <span className='danger'>{nameError}</span>
        </label><br/>
        <label>密码:<input type="password" name="password"
            defaultValue={password} onChange={this.passChange} />
            <span className='danger'>{passwordError}</span>
        </label><br/>
        <label>性别:
        <input type="radio" name="sex" value="1"
            checked={sex === '1' ? true : false} onChange={this.handleClick} />
        <input type="radio" name="sex" value="2"
            checked={sex === '2' ? true : false} onChange={this.handleClick} />
        </label><br/>
        <label>手机号:<input type="text" name="phone"
            defaultValue={phone} onChange={this.phoneChange} />
            <span className='danger'>{phoneError}</span>
        </label><br/>
        <label>选择城市:
            <select name="select" defaultValue={select} onChange={this.handleClick}>
                {
                    arr.map(item => {
                        return <option key={item.id} value={item.id}>{item.city}</option>
                    })
                }
            </select>
        </label><br/>
    </form>
    <button onClick={this.handleSubmit}>点击提交</button>
</div>

然后定义表单验证的函数:
将组件传过来的值进行判断,给出对应的error展示

// 姓名校验处理
nameChange = (e) => {
     let rule = /^[a-zA-Z0-9]{4,10}$/
     let value = e.target.value
     let error = ''
     if(!value) {
         error = '请输入昵称'
     } else if (!rule.test(value)) {
         error = '请输入4-10位昵称'
     } else {
         error = ''
     }
     this.setState({
         name: value,
         nameError: error
     })
 }
 
 passChange = (e) => {
     let rule = /^\S*(?=\S{6,12})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/
     let value = e.target.value
     let error = ''
     if(!value) {
         error = '请输入密码'
     } else if (!rule.test(value)) {
         error = '请输入6-12需要包含大小写字母和数字以及特殊符号'
     } else {
         error = ''
     }
     this.setState({
         password: value,
         passwordError: error
     })
 }

 phoneChange = (e) => {
     let rule = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/
     let value = e.target.value
     let error = ''
     if(!value) {
         error = '请输入手机号'
     } else if (!rule.test(value)) {
         error = '请输入格式正确的手机号'
     } else {
         error = ''
     }
     this.setState({
         phone: value,
         phoneError: error
     })
 }

来看效果:
在这里插入图片描述
这样我们便实现了表单校验,但是如果表单内容比较多,那么验证的代码就要写很多,对于这一块如何去优化呢?继续往下

表单验证方法的优化

对于上面表单验证的方法,很明显有很多重复的地方,那么就可以对其进行封装
将rule的内容写成传参的形式
在函数中使用new RegExp描述正则,e.target.getAttribute('rule')取到rule的值
使用name+‘Error’拼接名字进行赋值

// 校验方法封装
handleChange(e, info1, info2){
    // console.log(e.target);
    let { name, value } = e.target
    let rule = new RegExp(e.target.getAttribute('rule'))
    let error = ''
    if(!value) {
        error = info1
    } else if (!rule.test(value)) {
        error = info2
    } else {
        error = ''
    }
    this.setState({
        [name]: value,
        [name + 'Error']: error
    })
}
<label>姓名:<input type="text" name="name"
    rule="^[a-zA-Z0-9]{4,10}"
    defaultValue={name} onChange={(e) => this.handleChange(e, '请输入昵称','请输入4-10位昵称')} />
    <span className='danger'>{nameError}</span>
</label><br/>
<label>密码:<input type="password" name="password"
    rule="^\S*(?=\S{6,12})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$"
    defaultValue={password} onChange={(e) => this.handleChange(e, '请输入密码','请输入6-12需要包含大小写字母和数字以及特殊符号')} />
    <span className='danger'>{passwordError}</span>
</label><br/>
<label>性别:
<input type="radio" name="sex" value="1"
    checked={sex === '1' ? true : false} onChange={this.handleClick} />
<input type="radio" name="sex" value="2"
    checked={sex === '2' ? true : false} onChange={this.handleClick} />
</label><br/>
<label>手机号:<input type="text" name="phone"
    rule="^(?:(?:\+|00)86)?1[3-9]\d{9}$"
    defaultValue={phone} onChange={(e) => this.handleChange(e, '请输入手机号','请输入格式正确的手机号')} />
    <span className='danger'>{phoneError}</span>
</label><br/>

这样写起来是不是代码量少了很多呢,实现的效果是完全一样的

如果对你有帮助,点赞支持一下呀,关注我后续会带来更多优质内容~
在这里插入图片描述

相关文章
|
2月前
|
移动开发 前端开发 JavaScript
React 表单与事件
10月更文挑战第10天
48 1
|
2月前
|
前端开发 JavaScript 数据安全/隐私保护
深入探索研究React表单
【10月更文挑战第6天】
91 57
|
19天前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
30 4
|
1月前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
86 2
|
1月前
|
前端开发 API UED
React 图片轮播 Carousel:从入门到进阶
本文介绍了在 React 中实现图片轮播(Carousel)的方法,从基础安装和配置 `react-slick` 开始,逐步讲解了常见问题如图片路径、性能优化、自定义样式和交互处理,以及高级话题如动态数据加载和响应式设计。通过详细示例,帮助开发者避免易错点,提升轮播图的用户体验。
37 3
|
2月前
|
移动开发 前端开发 JavaScript
React DnD:实现拖拽功能的终极方案?
本文首发于微信公众号“前端徐徐”,介绍了一个强大的 React 拖拽库——React DnD。React DnD 帮助开发者轻松创建复杂的拖拽界面,适用于 Trello 风格的应用、列表重排序、可拖拽的 UI 组件等场景。文章详细介绍了 React DnD 的基本信息、主要特点、使用场景及快速上手指南。
176 3
React DnD:实现拖拽功能的终极方案?
|
1月前
|
移动开发 前端开发 JavaScript
React 表单验证实战
【10月更文挑战第25天】本文介绍了 React 表单验证的常见方法,包括原生 HTML5 验证、自定义验证逻辑和第三方库(如 Formik 和 Yup)的使用。通过具体代码示例,详细讲解了每种方法的实现步骤,并探讨了常见问题和易错点及其解决方法。旨在帮助开发者提高表单验证的有效性和安全性。
78 8
|
1月前
|
前端开发 JavaScript
React 表单处理技巧
【10月更文挑战第24天】本文从初学者角度出发,详细介绍了 React 中表单处理的基本概念、常见问题及解决方案。涵盖受控组件与非受控组件的区别、状态更新、表单验证、多字段管理及高级技巧,通过代码示例帮助读者更好地理解和应用。
83 7
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
88 10
|
2月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门