飛冰表單解決方案 - FormBinder
前言
中後台業務場景中,表單是一種很常見的與用戶交互的方式,從業務角度看,表單主要是收集用戶的信息,而從技術角度看,作為一個通用型的組件,它要解決的問題無非就是三個:
- 把一個初始數據對象扔給它,它能夠讓 Form 內的交互型組件獲取到數據並展示出來,同時這些組件上的數據也能反過來讓 Form 組件獲取到
- 支持表單數據的各種規則校驗,自定義提示信息的展示,自定義組件等
- 怎麼讓寫表單變得簡單
功能
- 類似雙向數據綁定的數據管理
- 數據進行校驗
- 自定義組件和布局
類似雙向數據綁定的數據管理
FormBinder 的設計非常簡單,將表單數據的管理和視圖分離開來,表單的狀態維護在組件內部,通過 values 初始化表單的數據,當表單域發生改變時會通過 onChange 動態更新 values,從而達到類似雙向數據綁定的效果。也有點類似於最近的 react hooks,將 state 進行單獨維護,實現 UI 和 Logic 的分離。
FormBinderWrapper 作為整個表單的容器,接收 value 和 onChange 等屬性,其中 value 會作為整個表單數據的根節點,交由下層組件去獲取、更新等操作:
import React, { Component } from react;
import { FormBinderWrapper, FormBinder } from @icedesign/form-binder;
import { Input } from @icedesign/base;
class Login extends Component {
// 設置表單初始數據
state = {
value: {
username: ,
password: ,
checkbox: false
}
};
// 表單的輸入改變這裡會動態響應
formChange = value => {
console.log(value);
};
render() {
return (
<FormBinderWrapper
value={this.state.value} // 傳遞 values
onChange={this.formChange} // 響應 onChange
>
<FormBinder name="username" required message="請輸入正確的名稱" >
<Input />
</FormBinder>
</FormBinderWrapper>
);
}
}
經過 FormBinderWrapper 包裝的組件,數據傳遞和同步將被接管,這意味著:
- 你不需要使用表單元素的 onChange 來做同步,但還是可以繼續監聽 onChange 等事件。
- 你不需要使用表單元素的 value、 defaultValue 等屬性來設置表單元素的值,只需通過初始的 value 進行設置。
- 你不需要通過 setState 來動態更新表單的值,因為表單默認支持雙向數據通信,但可以通過 setFieldValue 和 getFieldValue 來設置或者更新表單域的值。
示例:
數據進行校驗
FormBinder 在數據校驗上基於 async-validator 實現,提供了常見的校驗規則,只需在相應的組件上添加校驗規則即可,如果某些場景校驗太複雜,也可以通過 validator 自定義校驗規則實現。FormBinder 提供了 FormError 組件,可以根據需求自定義數據校驗和表示提示信息展示。
import { FormBinderWrapper, FormBinder, FormError } from @icedesign/form-binder;
...
<FormBinderWrapper
value={this.state.value}
onChange={this.formChange}
>
<FormBinder name="username" required message="請輸入正確的名稱" >
<Input />
</FormBinder>
// 自定義錯誤信息提示,FormBinder 和 FormError 需要保證 name
<FormError name="username" />
</FormBinderWrapper>
...
示例:
自定義組件和布局
FormBinder 核心是提供了數據的綁定(binding), 因此使用 FormBinder 你可以任意的選擇組件庫,也可以自定義組件 自由組合表單的布局,展示表單提示等,其核心是對錶單數據的抽象。當表單數據沒有通過校驗或者需要分步驟提示等場景時,非常的方便。
最後
FormBinder 的設計非常簡單,解決的問題也非常簡單,它只做了數據的雙向狀態管理收集和支持數據校驗,這也是我們將它命名為 FormBinder 的原因。
詳細文檔請參考: FormBinder 組件
擴展信息
淘寶開發者平台
- 官方網站:飛冰-讓前端開發簡單而友好
- 下載 Iceworks:https://alibaba.github.io/ice/iceworks
- Github:http://github.com/alibaba/ice
- 飛冰群二維碼:點擊這裡查看二維碼
- 聯繫 & 招聘 ice-admin[at]alibaba-inc.com
推薦閱讀: