浅谈redux-form在项目中的运用

准则

先说一下redux的使用场景,因为如果没有redux,那更不会有redux-form。

redux基于Flux架构思想,是一个状态管理框架,其目标是解决单页面应用中复杂的状态管理问题。

日常前端开发中,如果只是做一个简单的运营活动页面,甚至是一些路由稍微复杂一些的SPA项目,都可能用不到redux;只有在页面存在多种数据来源,交互非常复杂的项目中,才有必要引入redux。

 

redux的作者Dan Abramov指出:

“只有遇到 React 实在解决不了的问题,你才需要 redux 。”

前些日子开发的转转魔方系统,用于搭建转转日常的运营活动页面,因组件较多,交互复杂,采用了React+redux架构。先上一张“高大上”的截图(当然布局、配色可以忽略,因为没有UI资源,是我自己瞎搞的):

那么,为什么采用redux-form呢? 先让我们看一下两个普通的表单:

想象一下,如果用state来保存要提交的数据,用onChange来获取用户输入,然后改变state中相应数据荐,简直是梦魇一般。

幸亏,我们有redux和redux-form,redux用来管理状态,redux-form来负责表单数据部分

本文不介绍redux,如果想了解关于redux的更多,可以移步http://www.redux.org.cn/ ,还可以参考阮一峰的教程:http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html



好了,废话说了一大堆了,现在让我们进入正题:

redux-form主要做以下4件事:

  • 一个 redux reducer,监听redux-form派发出的actions,统一管理我们redux中的form state;
  • 一个React组件装饰器,包含我们用高阶组件组装的整个form,提供一个带一些props的纯函数;
  • 一个Filed组件将用户输入与redux store相连接;
  • 用单个的Action Creator将我们的form与应用挂勾在一起。

 

先来了解一下redux-form的生命周期:

基本用法

必须要做的第一步,是先把redux-form的reducer用combineReducer方法给到redux。不管我们的应用中有多少form组件,我们只需要执行一次这样的操作:

请注意,传递给redux-form的默认key为form,虽然支持自定义key names,但一般情况下请勿修改这个名字。详见http://redux-form.com/6.7.0/docs/api/ReduxForm.md/#-getformstate-function-optional-。

第二步,将普通表单组件用reduxForm()方法装饰,如此一来我们的组件才会拥有form state和一些表单方法。

请注意:const { handleSubmit, pristine, reset, submitting } = props中的各项并``不是从它的父组件传过递,而是从redux-form传递过来`。

pristine、submitting分别可以标识表单的当前状态。 pristine表示表单还没有进行任何动作,如输入、获取、失去焦点等 submitting表示正在提交

我们也可以主动告诉redux-form我们希望管理哪些输入:

初始化数据

在日常前端开发过程中,尤其是后台OA中,经常会遇到新增和编辑页面,此时如果建两个页面(或者用两个不同View的路由),无疑会增加日后维护成本(学习React之初踩过这个坑),所以初始化数据尤为重要。

redux-form提供initialValues,以供表单初绍化数据。

官网中的初始化数据来自reducer(Reducer设计优雅的基础上,推荐此方法):

当然我们的数据也可能来自props(理论上数据应该完全放到一个store中,但实际项目开发过程中却未必——我们还是会用到setState,因为某个state可能只是特定组件的一个开关,没有必要放到store中)。

转转魔方系统中的页面配置初始数据就是来自props:

数据校验

数据校验是表单操作中必不可少的一部分,redux-form为我们提供了3种数据校验方法:

  1. 同步验证,包含Field-Level校验;
  2. 提交数据合法性验证(非数据格式,如用户名+密码是否匹配等);
  3. 异步验证(Async Validate)

同步验证

同步验证有两种方式。

  1. 通过一个自定义的验证函数,这个函数默认会传入携带表单字段值组成的一个object,返回对象为一个error组成的object对象。
  2. 在Field组件中传入一个validate的props,把需要验证的字段单独或者以数据形式传入。

以自定义验证函数为例:

redux-form的验证还支持warning,该警告不阻止表单提交,只给出提示

跟初始化数据一样,验证规则同样需要通知redux-form:

提交数据合法性验证(官方叫Submit Validation,根据Demo示例我给引申了一下)

用redux-form做服务端的推荐方式,是从onSumit方法中返回一个失败的(rejected)promise。

在表单的提交函数中,redux-form也提供了两种方式来校验:

  1. 通过props中的onSumit函数传递给装饰组件;
  2. 通过参数中的this.props.handleSubmit将form做为该函数的实参传递,可以在组件内部使用onClick={this.props.handleSubmit(mySubmit)}来代替提交按扭的默认提交事件。

在装饰组件中这样触发:

异步验证(Async Validation)

服务端异步验证最好的方式是Submit Validation,有时候在我们输入表单后,会即时的进行服务端验证,比如注册的时候验证用户名是否已存在。

asyncValidate通常也返回一个error或者resolve的reject对象。

以上便是这次的文章分享了,想对redux-form有更多的讨论,可以给我们留言哦。想认识我们团队这位小伙伴的,可以关注他的个人博 http://ushtml.com/

如果你喜欢我们的文章,关注我们的公众号和我们互动吧。

时间: 2024-11-07 00:16:35

浅谈redux-form在项目中的运用的相关文章

浅谈 OneAPM 在 express 项目中的实践

[编者按]OneAPM 运营团队,近日在 github 上发现了一篇文章,特别奉献给大家.本文作者王宇先生从2015年年初就开始使用我们的产品,也是OneAPM 的忠实用户. OneAPM 是一个优秀的性能监控平台.为什么我们要使用性能监控呢? 并不是为了炫耀我有多么酷的玩具,仅仅因为我们希望在问题发生的第一时间就能知道. 在第一时间发现问题,把问题解决于无形之中,总比出了大麻烦通宵达旦加班舒服得多. 然而有的人喜欢说:「有些问题留着也不会有什么影响.」但我觉得服务端的事情, 凡是冒烟的地方,终

浅谈设计模式的学习(中)

在<浅谈设计模式的学习(上)>中我说到了设计模式的基石-----抽象思维.为什么需要抽象思维呢?因为越抽象就越不容易出错,就像有些领导人说话:坚持改革开放.但怎么算坚持改革开放呢,没有具体的标准,因事而异,所以就不容易违背这个坚持改革开放的原则了. 3.学习设计模式,要保持抽象的思维     什么是抽象思维呢?真的不好说,抽象的东西往往难以说明白,听了也难以搞明白,还是通过具体的例子来说吧 有这么一个学生请假的场景,如果请假时间一天以内则有班长批准就可以了,三天以内则需要老师批准,超过三天就得

转:浅谈CSS在前端优化中一些值得注意的关键点

前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加载时间,但其实性能不仅仅是指加载时间,还包括浏览器性能.网络性能.开发效率.在Web前端开发中,性能是一个非常重要的需要考虑的点.本文将介绍一些开发原则和性能准则,这些都是提高Web前端性能的基础. 1. 开发原则 1.1 编写符合当代浏览器性能的代码如果想提高前端性能,就必须理解浏览器的工作原理,

浅谈logo在PPT设计中的运用

在工业设计范畴,特别是产品设计中常常会提到“形式跟随功用”,也就是说产品的外型是树立在产品功用的根底之上的,同样道理,在PPT设计中则演化为“形式跟随内容”,就是说页面的美化设计是为了更好的将内容向观众传达. 为此我们总结了PPT设计的三个原则,即“图示化”,“图标化”,“图表化” 以“图标化”为例,所谓图标,就是具有指代意义的图形符号,具有高度浓缩并快捷传达信息.便于记忆的特性.应用范围很广,软硬件网页社交场所公共场所无所不在,例如各种交通标志…… 在用户界面设计范畴中则为图标的形式,包括程序

浅谈加速因子在策略中的意义

他站链接:浅谈加速因子在策略中的意义 NO:01没有完美的交易系统,但是却有完美的交易哲学.交易哲学.交易策略和资金管理三者缺一不可,才能构成正期望的交易系统.投机依赖价格的移动获得盈利(低买高卖或高买更高卖).在上升或下降趋势中,价格虽然在整体上朝着一个方向移动,但中间也会有短暂的反方向移动.而在横盘过程中,价格的移动方向则显得相对"随机"一些. NO:02关于价格的移动,可以类比物理学中的运动.其中包括:位移距离.时间.速度等.价格的位移相对于时间的比率就是价格的速度.除了速度之外

浅谈MVC Form认证

简单的谈一下MVC的Form认证. 在做MVC项目时,用户登录认证需要选用Form认证时,我们该怎么做呢?下面我们来简单给大家说一下. 首先说一下步骤 1.用户登录时,如果校验用户名密码通过后,需要调用FormsAuthentication.SetAuthCookie()这个方法. 2.用户退出时,需要调用FormsAuthentication.SignOut();方法 3.在配置文件web.config中,system.web 节点下, 配置<authentication  mode="

浅谈redux 中间件的原理

在使用redux管理异步数据流的时候,我们会使用中间件,以redux-thunk中间件为例,我们做一下分析: 首先是构建store,我们需要以下代码进行揉入中间件的类似creatStore函数的构造: const loggerMiddleware = createLogger(); const createStoreWithMiddleware = applyMiddleware( thunkMiddleware, loggerMiddleware )(createStore); export

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

浅谈贝塞尔曲线以及iOS中粘性动画的实现

关于贝塞尔曲线,网上相关的文章很多,这里我主要想用更简单的方法让大家理解贝塞尔曲线,当然,这仅仅是我个人的理解,如有错误的地方还请大家能够帮忙指出来,这样大家才能一起进步. 贝塞尔曲线,常用到的可分为如下几类,1阶曲线,2阶曲线(二次函数算是一种),3阶曲线,高阶曲线. 通用的方程为 这是由p0~pn这n+1个点组成的高阶方程. 但是光看这个方程的话或许大家会觉得不太理解,这东西到底能做什么? 我先逐渐的从1阶曲线讲起吧: 这里借鉴下这篇文章的几幅图片来描绘一下下列几个情况: 1阶曲线,是由两个

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建(十几篇)

一.简介 虽然GTK+是Linux下的开发环境,因为其跨平台特性,有时候需要在Windows上用到它的.如下是在Windows10下配置GTK+的开发环境.        Gnome的开发基础结构是围绕一组函数库的,所有的内容都是用可移植的ANSI C语言写成的,可以用于所有类UNIX系统,与图形相关的函数库依赖于X Window系统. Gnome函数库是最高层的.GTK+由两部分组成,GTK和GDK. GTK层为C语言提供了一个对象模型,并为UI工具包提供了最基本的widget,它是上层GUI