巨大的表單,在複雜的管理後臺中最爲常見。前端
一、字段多vue
二、結構複雜react
三、各類交互api
就至關於網頁上的銀行單吧,而且有各種交互(增刪改查)、校驗。數組
我相信此時的你使用的前端框架也是基於mvvm思想的框架(如vue、react等)。bash
因此,還得先簡短髮表一下我對mvvm的理解。前端框架
首先,mvvm的推崇不是毫無邏輯的,用的人多,天然說明用的舒服。框架
拆解:m(model)、v(view)、vm(viewModel)。mvvm
m與v是死的,vm是活的。vm就是核心,中樞神經。函數
因爲框架的處理,vm的變更會直接體如今m與v中。
也就是說,頁面交互邏輯、頁面數據實際上是經過控制vm來實現的。
(react的state、props,vue中的model、props均可以成爲vm角色)
對於大部分狀況,咱們會將vm直接定義成一個對象,將全部的字段都寫進去。
編寫view部分,也就是切圖部分。每個模塊切一片,將vm裏的字段對應的寫進去。
將頁面中全部的字段定義爲一個config對象,這個config對象包含了字段全部的信息(理想狀態)。
{
key: 'chineseName',
value: null,
label: '公司名稱(中文)',
type: 'input',
config: {
isRequested: true,
validReg: /^[\u4e00-\u9fa5\s]+$/,
validMsg: '請輸入純中文!'
}
},
{
key: 'companyType',
value: 1,
label: '公司類型',
type: 'select',
config: {
isRequested: true,
options: companyTypeArray()
}
}
複製代碼
好比是input
仍是select
,或者checkbox
,單選
或者多選
等等。
以及字段的label
,校驗規則
等。
基於這個config
,能夠編寫函數提取出咱們須要的vm
對象。
// 獲取數據模型
getModuleObj: arr => {
return arr.reduce((obj, item) => {
obj[item.key] = item.value
return obj
}, {})
}
複製代碼
我以爲比較重要的是,我從一個config
中,就能看出整個頁面的邏輯與數據。
當須要修改、新增、刪除時,只須要操做config
就好了。
這是第一步,肯定好config
的思路後,進入我認爲大表單最重要的部分。
vm是咱們頁面展現的數據,傳給api的,是另外一個數據。
二者在層級結構上是相似的。
這裏不該該有太大差別。若是差別太大,說明一開始字段定義的時候前端並無參與。
fn1(vmData) -> apiData
好比這裏我須要將數組轉換爲|分隔的字符串
// 遞歸處理modelData數據 modelData => apiData
const setParam = data => {
if (data instanceof Array) {
if (data.length > 0) {
if (data[0] instanceof Object) {
for (let i = 0; i < data.length; i++) {
data[i] = setParam(data[i])
}
} else {
data = '|' + data.join('|') + '|'
return data
}
} else {
data = '||'
}
} else if (data instanceof Object) {
for (let k in data) {
data[k] = setParam(data[k])
}
}
return data
}
複製代碼
fn2(apiData) -> vmData
只須要編寫兩個函數作數據的轉換便可,層級較深可用遞歸處理。
總結一下,我這裏對大表單的處理,其實就兩點。
一、config描述文件(vm、view以此配置)
二、vm、apiData的相互轉換(數據錄入與數據回顯)
複製代碼
能妥善處理好這兩個問題,基本上大表單也就處理好了,剩下的就是細節的打磨。