:这篇博客参考自redux-form的官方英文文档)左转http://redux-form.com/6.5.0/examples/syncValidation/

在这篇博客里,我将用redux-form实现一个同步验证的表单,它将满足以下条件:

1有三个输入框:用户名输入框(username),邮箱输入框(email)和年龄输入框(age)

2如果点击输入框获取焦点后未输入内容,则在输入框失去焦点后发出错误(error)提示:XXX不能为空,且此时不能提交成功

3如果在输入框中输入内容不合法,比如用户名过长(length>5)发出错误提示:不能大于五个字,且此时不能提交成功

4如果在输入框中输入内容合法但需警告,则提示警告(warn)内容,此时虽然发出警告但仍能提交成功(请区分和2和3中的区别)

5在尚未输入内容时(pristine=true)或在提交过程中(submitting=true),禁止使用提交按钮。在点击清空按钮时,调用reset()方法清空所有输入框中的内容

首先附上form.js的代码:(这份展示一共两份代码:index.js和form.js,index.js的内容请看上一篇博客)

import React from 'react'
import { Field, reduxForm } from 'redux-form' const validate = values => {
const errors = {}
if (!values.username) {
errors.username = '用户名不能为空'
} else if (values.username.length > 5) {
errors.username = '不能大于五个字'
}
if (!values.email) {
errors.email = '邮箱不能为空'
} else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(values.email)) {
errors.email = 'Invalid email address'
}
if (!values.age) {
errors.age = '年龄不能为空'
} else if (isNaN(Number(values.age))) {
errors.age = '年龄必须是一个数字'
} else if (Number(values.age) < 18) {
errors.age = '对不起,你未满18岁'
}
return errors
} const warn = values => {
const warnings = {}
if (values.age < 19) {
warnings.age = '你年龄还有点小哦!'
}
return warnings
} const renderField = ({ input, label, type, meta: { touched, error, warning } }) => (
<div>
<label>{label}</label>
<div>
<input {...input} placeholder={label} type={type}/>
{touched && ((error && <span>{error}</span>) || (warning && <span>{warning}</span>))}
</div>
</div>
) const SyncValidationForm = (props) => {
const { handleSubmit, pristine, reset, submitting } = props
return (
<form onSubmit={handleSubmit}>
<Field name="username" type="text" component={renderField} label="Username"/>
<Field name="email" type="email" component={renderField} label="Email"/>
<Field name="age" type="number" component={renderField} label="Age"/>
<div>
<button type="submit" disabled={submitting}>Submit</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>Clear Values</button>
</div>
</form>
)
}
export default reduxForm({
form: 'syncValidation', //你的redux-form的特殊标记,必填项
validate, // 上面定义的一个验证函数,使redux-form同步验证
warn // 上面定义的一个错误提示函数,使redux-form同步错误提示
})(SyncValidationForm)//写入的redux-form组件
 

1什么是Field组件?

Field组件是redux-form组件库中的核心组件,它位于你的输入框(input)或输入框组件的外一层,将其包装起来从而使输入框能和redux的store直接连接起来。

它有两个最重要的属性:name属性和component属性,且这两个属性都是必填项

<Field name="username" type="text" component={renderField} label="Username"/>

在上面的Field中name和component是必填的,而type属性和label属性是选填的,但选填的属性(如type和label)可通过props属性传入它的component中,比如以上的renderField中

2Field组件的name属性和component属性

  • name属性是Filed组件的名称,也即Field下输入框的名称,它将成为存储form表单数据的values对象中的属性名:比如

    redux-form的学习笔记二--实现表单的同步验证的更多相关文章

    1. angular学习笔记(二十)-表单验证

      本篇主要介绍angular中的表单验证: 表单验证主要有以下一些内容: 1. required指令: 相当于html5的required属性,验证不能为空 2. ng-maxlength属性: 验证内 ...

    2. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

      Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

    3. 吴裕雄--天生自然HTML学习笔记:HTML 表单和输入

      HTML 表单用于收集不同类型的用户输入. <!DOCTYPE html> <html> <head>  <meta charset="utf-8& ...

    4. knockoutJS学习笔记08:表单域绑定

      前面的绑定都是用在基本标签上,这章主要讲表单域标签的绑定. 一.value 绑定 绑定标签:input text.textarea. <p>用户名:<input type=" ...

    5. HTML5学习笔记<五>: HTML表单和PHP环境搭建

      HTML表单 1. 表单用于不同类型的用户输入 2. 常用的表单标签: 标签 说明 <form> 表单 <input> 输入域 <textarea> 文本域 < ...

    6. PHP学习笔记 01 之表单传值

      一.HTML传值/PHP接收方法 1.GET(地址栏+问号+数据信息) (1)方式一:表单Form: method = 'get' GET接收数据方式: $_GET['表单元素name对应的值] (2 ...

    7. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

      前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

    8. Yii学习笔记之四(表单验证 api 翻译)

      1.表单验证 对于用户输入的全部数据,你不能信任,必须加以验证. 全部框架如此.对于yii 能够使用函数  yii\base\Model::validate()  进行验证 他会返回boolean值的 ...

    9. HTML 学习笔记 JQuery(表单,表格 操作)

      表单应用 一个表单有3个基本组成部分 (1)表单标签:包含处理表单数据所用的服务器端程序URL 以及数据提交到服务器的方法 (2)表单域:包含文本框 密码框 隐藏框 多行文本框 复选框 单选框 下拉选 ...

    随机推荐

    1. python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1

      mylib.py #encoding=utf-8 import os import include from include import * TABLESPACE_NAME='D:\\mysql_d ...

    2. swift 中使用OC第三方库(以AFNetworking为例)

      首先呢  把你需要的第三方库导入到你的项目中来  具体怎么导入 这不是这篇的重点  看上一篇 废话不多  直接上 (1)在项目中直接建一个 oc 的控制器  然后xcode会提醒你  要不要建造桥接文 ...

    3. HTML URL

      HTML 统一资源定位器(Uniform Resource Locators) URL 是一个网页地址. URL可以由字母组成,如"runoob.com",或互联网协议(IP)地址 ...

    4. python如何安装模块

      1.从 https://pypi.python.org/pypi/XXXX  下载压缩包 2.解压所下载的压缩包 3.CD到解压目录,执行 sudo python setup.py install

    5. Flex组件的生命周期

      组件实例化生命周期描述了用组件类创建组件对象时所发生的一系列步骤,作为生命周期的一部分,flex自动调用组件的的方法,发出事件,并使组件可见. 下面例子用as创建一个btn控件,并将其加入容器中 va ...

    6. 微信小程序t填坑之旅一(接入)

      一.小程序简介 小程序是什么? 首先"程序"这两个字我们不陌生.看看你手机上的各个软件,那就是程序.平时的程序是直接跑在我们原生的操作系统上面的.小程序是间接跑在原生系统上的.因为 ...

    7. Java各种工具下载

      http://yunpan.cn/cyUzqFTu8pEER  提取码 355c  myeclipse2013 http://yunpan.cn/cyUzPi7nC8Z9S  提取码 fc4b  my ...

    8. Spark工作机制简述

      Spark工作机制 主要模块 调度与任务分配 I/O模块 通信控制模块 容错模块 Shuffle模块 调度层次 应用 作业 Stage Task 调度算法 FIFO FAIR(公平调度) Spark应 ...

    9. iOS核心笔记—源代码管理工具-SVN

      源代码管理工具-SVN 一. 源代码管理工具概述 1. 源代码管理工具的作用? > 能追踪一个项目从诞生一直到定案的过程 > 记录一个项目的所有内容变化,无限制返回 > 查看特定版本 ...

    10. js实现省市区联动

      先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...