現在有個項目表單很多,用什麼技術框架合適?
建議回答問題之前把團隊規模寫一下,有很多人回復使用動態表單,那麼製作這個動態表單系統需要多少人,花了多少時間?如何解決一些特殊校驗問題(例如用戶名已存在這種)?系統趕著上線呢?
我們內部基於 React 寫了一套動態表單,業務上有 100 多個表單,每天從這裡發出 23W 的內容量,表單聯動我們設計了一套機制,完全由後端控制的,因此前端只開發了一套引擎組件和 20 個表單組件,React 挺好用啊。
既然問題描述被 @王宇鵬 修改增加了,那我補充下這個動態表單。
首先表單組件很多是現成的,公司內部有類似 Antd 的一套基礎組件,基於這套基礎組件我們擴展了一套業務表單組件,這些表單組件都按照一定表單規範開發。之後這些表單組件按照一定的協議拼裝在一起可以形成一張表單,但是這種靜態表單使用場景很有限,它沒法聯動,只能前端校驗,沒法實現用戶名校驗。
為了讓整套表單完全由後端控制,我們設計了一套非同步聯動的機制,簡單的說當某個表單內容變更的時候,可以觸發一個 AJAX 整個表單發送給後端介面,後端進行業務邏輯校驗並標記報錯或者取消掉之前的報錯,進而刷新整個表單。藉助 React 的渲染能力和組件,這一切十分絲滑。
表單組件另算,動態表單引擎 1.0,一個前端 4 天開發完成,表單引擎整個重寫 2.0,我花了一周多一點。
系統趕著上線,所以才更要做這一套東西,因為我們評估下來系統上線會立馬生成大量表單(其實很快就有幾十個表單),你可以選擇我硬編碼趕緊搞一個表單應對當前需求,不過估計你已經累死了。
我覺得還是原生的form最好啊,標籤里寫好name,form 上寫好action,button上寫好submit,一句js都不用寫就可以提交給服務端
如圖,除了我廠的 AntD 外,Mozilla 的 Form 也非常不錯,我們後台很多程序在用的就是這個react-jsonschema-form playground,文檔非常豐富且很好擴展。雖然我個人非常喜歡並且樂意造輪子,此前也造過3套 Web Form 和 1 套 iOS Native Form 的輪子,但是在 React 上還是非常推薦使用這款線程的表單組件。
數據大綱 Schema
我們都知道如果想生成一個單項/雙向數據綁定的表單,首先需要一個數據大綱,即定義表單的標題、屬性欄位的類型、默認值、校驗規則、候選枚舉項等。數據的大綱通常是統一定義在服務端的,每個廠都有自己的實現方式,但是我猜都可以輕鬆映射成 react-jsonschema-form 要求的格式:
const schema = {
type: "object",
properties: {
foo: {
type: "object",
properties: {
bar: {type: "string"}
}
},
baz: {
type: "array",
items: {
type: "object",
properties: {
description: {
"type": "string"
}
}
}
}
}
}
上面的 json 對於前後端開發人員都應該很容易理解吧。
界面大綱 UI Schema
接下來就是定義 UI 大綱,包括欄位的編輯器類型、輔助說明、幫助提示等:
const uiSchema = {
foo: {
bar: {
"ui:widget": "textarea"
},
},
baz: {
// note the "items" for an array
items: {
description: {
"ui:widget": "textarea"
}
}
}
}
編輯器 Widgets
react-jsonschema-form 支持的 widget 類型(可以理解成編輯器類型)包括:
- Boolean 值
- radio
- select
- checkbox
- 數值
- updown selector
- range slider
- 文本值
- textarea
- password
- color
- 其他常用值
- uri
- date and date-time
- 單選及多選
- select
- checkboxes
最後的組裝
在你的 React 最中引入 Form 十分簡單:
import React, { Component } from "react";
import Form from "react-jsonschema-form";
class MyComponent extends Component {
...
render() {
const { schema, uiSchema } = this.props;
return (
&
);
}
}
實戰
在我們自己的實踐中,schema 即數據大綱,來自於服務端,可以是通過一個 Restful API 獲得,也可以在頁面下載時,通過服務端渲染放置在
我還是推薦我寫的heyui吧,驗證機制基本cover一些死角。
當然所有東西都是我寫的,優化起來也比較快,最後還要看你那邊的技術選型了。Form 表單 - HEY UI - http://www.heyui.top/component/form/form 我過一段時間會寫文檔,歡迎提問。剛好最近做了關於聲紋數據管理的一個後台系統,也是大量用到表單,前端用的是React配合ANT DESIGN,沒有發現太多找死的地方,下面是其中一個頁面的核心內容,你隨意感受下。
呵呵.....手工用react碼錶單當然會死....如果 只是簡單的表單,後端配置好,前端來生成表單 是否可行呢?好像和用不用react沒多大關係。——我確實這麼干過。
所以推薦使用 Angular 。
如果表單聯動比較多,我用redux observable ,目前感覺良好
當表單多了 關聯關係多了 難度就不是快速開發了 而是需要知道該如何長期維護。
表單問題,不管是在jquery時代,還是angular/react時代,都永遠是前端工程師們的痛,但是這又是沒辦法的事情,業務需求多種多樣,對於中後台業務而言,表單頁面和報表頁面基本上是中後台業務的核心展現形式,但是,如何幫助開發者更高效的開發表單,目前傳統的表單開發方式:
- 手動管理表單狀態
- 手動收集表單數據
- 手動管理表單校驗狀態
帶來的問題
- 表單狀態管理變得越來越難以維護,不得已需要引入其他大而全的狀態管理庫,其實這僅僅只是一個領域性問題
- 當表單數量巨大的時候,如果每個表單都需要手動傳入value/onChange,那是不能容忍的,同時傳統表單開發的數據結構都是扁平結構,沒法很好的處理嵌套複雜數據的情況,如果硬是要處理,工作量會變得越來越大
- 當表單校驗規則存在聯動校驗的時候,要處理表單校驗簡直是噩夢,很容易產生大量的麵條代碼
- 當服務端有動態輸出表單的需求的時候,你將不得不自己開發一個基於某個json協議動態輸出表單的組件
- 當業務有對錶單操作效率等指標的監控需求的時候,你將不得不自己開發一個基於某個json協議動態輸出表單的組件來全局管理表單
- 當你希望在可視化搭建界面中快速配置產出表單的時候,你將不得不自己開發一個基於某個json協議動態輸出表單的組件
天貓在form領域問題抽象出了一個基於標準json-schema協議的React Form組件,以上所有問題都能很好解決,當然,藉助一定的抽象,會帶來些許學習成本,但如果忽略學習成本,重視開發效率的情況下,歡迎來天貓吧,讓你爽到高潮,簡歷投過來 zhili.wzl@alibaba-inc.com
多說一句,看到之前有人提到mozilla的schema-form,之前我們也是有調研過的,最後選擇不用它,主要是它強依賴了bootstrap,要改造的話,必須全部改造,得深入了解它的源碼,它不是天然與組件庫解耦的,同時,它的schema提出了ui-schema的概念,其實描述ui並不是特別優秀
在天貓,我們的任何方案都是基於標準,擴展標準,領域型問題,領域型解決方案解決。這是我們的核心設計理念
表單複雜,本來就複雜。和 react 沒關係,謝謝。
自己寫就比較蛋疼,我願意選擇vue 或ng
用某一個框架不是問題,關鍵是基於該框架的生態和工具鏈是否健全,社區目前的火熱程度。React是當下熱門的前端技術之一,表單業界也有ant design這種殺手級解決方案。你們可以參考和沉澱適用於自己業務的組件。
如果你是用react的話推薦螞蟻金服antdesign,其他如vue也有類似相應的組件庫。如果使用jquery,當然最好是自己封裝一個工具方法專門校驗,也可以GitHub搜相關針對form的組件,我就是用輪子很不爽就自己封裝一個,看個人具體場景吧
最近在用react+dva+螞蟻的antd庫寫一個後台管理系統,這套東西用起來感覺蠻不錯的,就是antd的的坑不怎麼好踩,尤其form那塊的,不過用熟悉之後效率挺高的,在配合dva,挺好,挺好。
人生苦短 我用ng
推薦個表單神器,專門處理form表單變化的 jnotnull/react-changehandler
我無法理解表單和react有什麼必然或者非必然的聯繫。表單是網頁中很重要的組成部分,而現在的框架基本上如果不支持表單操作怎麼活下來啊,即使沒有內置表單組件,那麼也一定會有熱心的群眾去寫一個第三方組件的,只要他足夠流行,而且你自己封裝一個,應該也不難吧。只要你有足夠的熱情,如果說你想使用成熟的框架一路梭到底,那我覺得你可以寫第一個然後複製粘貼應該也不難。
嗯?怎麼了?黑人問號?
redux-form對於複雜表單非常好用,同步非同步數據驗證提示都很簡單,我們線上產品用的redux-form.推薦。
推薦閱讀:
※參加第12屆D2前端技術論壇,你有什麼收穫?
※react中你們都是通過什麼方式實現動畫的?
※怎樣看待民工叔去螞蟻金服?
※前後端分離部署,腳手架環境下開發的前端代碼部署流程是怎樣的?
※拖拽生成組件,大家react怎麼實現?