前言
以前筆者有寫過一篇如何設計動態表單配置平臺的文章,可是因爲筆者電腦問題代碼丟失,因此後期從新實現了一套表單設計器,並優化了以前的設計方式,特意作一下總結和覆盤。javascript
你將收穫
-
動態表單開發的通常思路 -
可視化領域中的表單引擎 -
從零實現一款動態表單設計器 -
利用H5-Dooring開發一款表單設計平臺
正文
上圖中咱們將表單設計器集成到了H5-Dooring中,使其能夠實現拖拽生成表單。css
其次咱們能夠根據右邊的配置項,動態的添加某個表單組件或或者修改組件字段和數據源。在配置好表單以後咱們還能夠定製表單提交的api接口地址,以便實現用戶數據的可溯源性。前端
在開發以前,咱們先分析一下動態表單設計的通常實現思路。java
動態表單開發的通常思路
靜態化配置列表是最傳統的表單配置方式之一,基本思路就是利用母表來生成配置項,進而實現表單配置。相似於如下方式:node
基於json schema的動態表單配置有兩種實現方案, 一種就是支持在線修改json文件從而實現定製化,另外一種就是徹底無代碼操做,可是前提都須要提供一套通用的表單模版。相似於以下案例:react
此種方案能夠實現基本的表單自治。也是本文主要實現的方案。至於在線編寫json文件的方案。筆者以前也也過成熟的方案,具體能夠參考:webpack
基於jsoneditor二次封裝一個可實時預覽的json編輯器組件(react版)css3
支持在線編程的混合式表單設計方案是終極方案,也是目前流行的無代碼化平臺的思想之一。一方面它提供了基於json schema的動態表單配置, 對於一些強定製的,須要在線設計組件方案的模式,採用在線編程,實時打包成動態組件的方式,最後根據平臺的組件約定來實現組件庫的方式。以下圖所示:git
在線代碼編輯可使用react-codemirror2或者 react-monaco-editor插件來實現。至於在線打包,咱們用nodejs徹底能夠實現,筆者在作Dooring項目的在線下載代碼時就用到了該方案,感興趣的能夠了解一下。github
可視化領域中的表單引擎
可視化領域一方面強調的是圖形(可視化)的設計,一方面是動態表單。好比說咱們想傻瓜式的改變一張圖的數據,屬性,交互等,咱們須要經過表單這一橋樑來實現:
從零實現一款動態表單設計器
在實現表單設計器以前,咱們先來整理一下思路和需求。在筆者的最初草圖中,它長這樣:
從草圖中咱們能夠提取到以下任務信息:
-
定義一套表單組件庫 -
肯定表單全局屬性配置 -
實現表單操做curd(增刪查改)
-
單選框 -
複選框 -
單行文本 -
多行文本 -
下拉框 -
文件上傳 -
日期框 -
數值輸入框
以上這些基本知足咱們的平常開發需求,其次咱們還能夠開發數據源表單組件,列表組件,好比dooring實現的那樣:
在完成表單組件庫以後,咱們就須要根據配置項動態渲染了。也有兩種實現思路,一種就是相似於多條件判斷,以下:
{
item.type === 'Number' &&
<Form.Item label={item.name} name={item.key}>
<InputNumber min={1} max={item.range && item.range[1]} step={item.step} />
</Form.Item>
}
{
item.type === 'Text' &&
<Form.Item label={item.name} name={item.key}>
<Input />
</Form.Item>
}
{
item.type === 'TextArea' &&
<Form.Item label={item.name} name={item.key}>
<TextArea rows={4} />
</Form.Item>
}
複製代碼
// 維護表單控件, 提升form渲染性能
const BaseForm = {
"Text": (props) => {
const { label, placeholder, onChange } = props
return <Cell title={label}>
<Input type="text" placeholder={placeholder} onChange={onChange} />
</Cell>
},
"Number": (props) => {
const { label, placeholder, onChange } = props
return <Cell title={label}>
<Input type="number" placeholder={placeholder} onChange={onChange} />
</Cell>
}
}
// 動態渲染表單
{
formData.map((item, i) => {
let FormItem = BaseForm[item.type]
return <div className={styles.formItem} key={i}>
<FormItem {...item} />
</div>
})
}
複製代碼
是否是很優雅呢?後期咱們只須要在BaseForm裏維護表單組件便可,並且還能夠基於BaseForm對錶單進行包裝,實現動態刪除,編輯等功能。以下:
包裝後的代碼以下:
<div>
<div className={styles.disClick}><FormItem {...item} /></div>
<div className={styles.operationWrap}>
<span onClick={handleEditItem}><EditOutlined /></span>
<span onClick={handleDelItem}><MinusCircleOutlined /></span>
</div>
</div>
複製代碼
-
表單標題 -
表單背景圖片 -
表單背景顏色 -
提交按鈕樣式
以上的表單經過H5-Dooring設計而來。固然咱們能夠利用它設計更加自定的表單頁面。
最後一個比較使用的需求就是api定製,通常公司可能須要將用戶的錄入數據收集到本身的平臺,那麼這個時候咱們提供一個api表單提交接口積極頗有必要了,上面筆者也展現過,實現很簡單,就是配置裏多一個api的文本框便可。
最後一步就是實現表單的curd操做,展現以下:
具體實現也比較簡單,只須要基於BaseForm進行包裝,添加刪除/編輯/添加按鈕便可。具體能夠參考個人開源項目H5-Dooring,地址:H5-Dooring傳送門
利用H5-Dooring開發一款表單設計平臺
在H5編輯器Dooring的實現中,咱們能夠作抽象,每個頁面組件能夠當作特定的表單組件,以下圖:
咱們能夠利用dooring的能力對錶單平臺進行拖拽,樣式設計,數據錄入等等操做,感興趣的朋友能夠基於Dooring設計思路改形成本身的表單設計平臺。在文末筆者會附上dooring的github地址供你們研究參考。
H5可視化編輯器Dooring功能迭代說明
實時保存功能
添加進度條組件
添加websocket通訊
實如今線下載代碼功能
添加Button組件
添加動態表單設計器
最後
若是想學習更多H5遊戲, webpack,node,gulp,css3,javascript,nodeJS,canvas數據可視化等前端知識和實戰,歡迎在公衆號《趣談前端》一塊兒學習討論,共同探索前端的邊界。
更多推薦
本文分享自微信公衆號 - 趣談前端(beautifulFront)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。