淺談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/

 

 如果你喜歡我們的文章,關注我們的公眾號和我們互動吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM