|
導(dǎo)讀網(wǎng)頁的本質(zhì)就是超級(jí)文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級(jí)文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立... 網(wǎng)頁的本質(zhì)就是超級(jí)文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級(jí)文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語言之所以稱為超文本標(biāo)記語言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。 本篇文章給大家?guī)淼膬?nèi)容是關(guān)于JSON生成Form表單的詳細(xì)解析(代碼實(shí)例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對你有所幫助。JSON表單 描述 JSON表單是一個(gè)基于React的抽象組件,它可以把JSON數(shù)據(jù)格式描述的表單轉(zhuǎn)換成項(xiàng)目中的表單,它可以用簡短的幾行代碼,快速的生成Form表單。
原始表單的缺點(diǎn)1:代碼量龐大,開發(fā)效率低 2:不便于抽離和進(jìn)一步的抽象 3:維護(hù)成本高 4:需要額外處理校驗(yàn)和緩存等功能 一個(gè)栗子const config = {
formKey: 'example-form',
data: {
name: '',
descr: '',
typeName: ''
},
config: [
{
type: 'input',
dataKey: 'name',
label: 'param',
placeholder: '請輸入param',
validate: ['required', /^[a-zA-Z_{}0-9]+$/g],
style: {
display: 'inline-block',
width: 270,
},
},
{
type: 'select',
dataKey: 'typeName',
options: ['string', 'integer', 'float'],
style: {
display: 'inline-block',
width: 100,
margin: '0 15px'
},
validate: [{type: 'required', message: 'param類型不能為空'}]
},
{
type: 'textarea',
dataKey: 'descr',
placeholder: '請輸入param含義',
label: 'param含義',
validate: ['required'],
style: {
width: 385,
}
},
]
}
<From ref={ref => this.FormWrap = ref} config={config}></From>上面是用JSON描述的三個(gè)常用的表單組件組合成的表單,其效果圖如下:
JSON表單的格式{
formKey: 'paramAddForm',
data: {},
config: []
}
表單組件的配置{
type: 'input',
dataKey: 'name',
label: 'param',
validate: ['required'],
style: {}
}
關(guān)鍵字段解釋1. typetype是用來唯一表示表單組件類型的字段,其中JSON表單提供了三種默認(rèn)的表單組件:input、select、textarea,還有兩種復(fù)雜類型的表單組件:form_array、container。 form_array表單組件表示其數(shù)據(jù)結(jié)構(gòu)為Array,含有增加項(xiàng)刪除項(xiàng)的復(fù)合表單組件,該表單組件的配置里多一個(gè)children的字段,里面是每一項(xiàng)里面的表單組件配置的集合,其表單組件的效果如下圖所示:
container是用來自定義表單的接口,具體用法參考下面具體的介紹。 2. validatevalidate是校驗(yàn)表單組件數(shù)據(jù)正確性的字段,其值為數(shù)組,里面的數(shù)組元素可以為String、object、RegExp、Function。 JSON表單采用的是 1. 數(shù)組元素為string,其值可以為:
string,值必須為string
number,值必須為數(shù)字
required,值不能為空
boolean,值必須為布爾值
integer,值必須為整數(shù)形
float,值必須為浮點(diǎn)型
email,值必須為郵箱類型
2. 數(shù)組元素為object,其值為rules:
{type: 'enum', enum: ['1', '2'], message: '值不在確定范圍內(nèi)'}
3. 數(shù)組元素為RegExp, validate: [/^[a-zA-Z_{}0-9]+$/g]
4. 數(shù)組元素為Function, validate: [ (rules, value, callback) => {}]3. style用來確定表單組件在表單內(nèi)的布局樣式,比如想讓表單組件行內(nèi)顯示,且寬度為200,其style值如下: {
display: 'inline-block',
width: 200
}container表單組件container表單組件是用來自定義表單組件的,它主要的作用有以下幾點(diǎn):
使用栗子import { Input, Select } from 'antd'
const Option = Select.Option
{
type: 'container',
dataKey: 'descr',
style: {
display: 'inline-block',
width: 100,
margin: '0 15px'
},
options: ['string', 'integer', 'float'],
render: (curData, config, {changeFn, getFocus, loseFocus, error}) => {
return <Select value={curData}
style={{width: '100%', height: 35}}
onMouseEnter={getFocus}
onChange={(value) => changeFn(value, () => {
loseFocus()
})}>
{
config.options && config.options.map((item, idx) => <Option key={idx} value={item}>{item}</Option>)
}
</Select>
}
},container表單組件只是多一個(gè)render渲染方法,里面可以自定義表單組件的渲染內(nèi)容,render方法提供如下參數(shù): 1. curData: 當(dāng)前container組件的值,跟dataKey相關(guān) 使用antd的組件庫JOSN表單只提供了input、select、textarea三種默認(rèn)的表單組件,遠(yuǎn)遠(yuǎn)不夠真實(shí)的項(xiàng)目中使用,所以我們可以將antd組件庫中的組件封裝到JSON表單中,這樣我們就可以再項(xiàng)目中很快的使用antd中的組件。 antd-components.js import React from 'react'
import { Input } from 'antd'
export default [
{
type: 'antd-input',
render: (curData, config, {changeFn, getFocus, loseFocus, error}) => {
return <Input value={curData}
onFocus={getFocus}
onBlur={loseFocus}
placeholder={config.placeholder ? config.placeholder : ''}
style={{borderColor: !!error ? '#f5222d' : ''}}
onChange={event => changeFn(event.target.value)} />
}
}
]我們在antd-components.js文件中聲明一個(gè) init.js import Form from 'Form'
import components from './antd-components'
From.createCustomComp(components)
const config = {
formKey: 'paramAddFromAntd',
data: {
name: '',
},
config: [
{
type: 'antd-input',
dataKey: 'name',
label: 'Param',
placeholder: '請輸入param',
validate: ['required', /^[a-zA-Z_{}0-9]+$/g]
}
]
}
<From ref={ref => this.FormWrap = ref} config={config}></From>使用container來引入antd組件庫,其原理就是通過container將antd組件封裝成'antd-input'自定義組件,然后使用它,這種方式不僅可以用來封裝組件庫,還可以用來共享一些共用表單組件,可以將常用的復(fù)雜表單組件封裝在一個(gè)共用文件里,然后在不同項(xiàng)目中引用,就可以跨項(xiàng)目共用表單組件。 在自定義組件中,如果需要自定義表單提交數(shù)據(jù)函數(shù),但是又不能重寫render方法以防覆蓋原先的render方法,所以可以使用modifyDataFn方法來覆蓋render中的提交數(shù)據(jù)部分。 modifyDataFn: ({changeFn, changeDataFn}, {parent, self}) => {
let {parentData} = parent
parentData = parentData.map(item => ({
...item,
name: self.curData
}))
changeDataFn(parent.parentKey, parentData)
}處理控制邏輯和聯(lián)動(dòng)邏輯在JSON表單JSON配置中,有assistData的選填字段,該字段為JSON表單處理控制邏輯的額外數(shù)據(jù),例如在表單內(nèi)有一個(gè)刷新按鈕,其實(shí)現(xiàn)代碼如下: {
data: {},
assistData: {
refreshParam: false
},
config: [
{
type: 'container',
dataKey: 'assistData.refreshParam',
render: (curData, config, {changeFn, changeDataFn}) => {
const handleClick = () => {
changeDataFn('assistData.refreshParam' ,true)
setTimeout(() => {
changeDataFn('assistData.refreshParam' ,false)
}, 1000 * 3)
}
return <React.Fragment>
{
config.index === config.parentData.length - 1 &&
<Popover placement="top" content="刷新param列表">
<Button shape="circle" loading={curData} onClick={handleClick}>{!curData && <Icon type="reload" />}</Button>
</Popover>
}
</React.Fragment>
}
},
]
}注意: 如果要使用assistData中的數(shù)據(jù),其dataKey必須以 render方法內(nèi)嵌套組件配置{
type: 'container',
dataKey: 'param',
render: (curData, config, {changeFn, changeDataFn, JSONForm}) => {
return <p>
{
JSONForm([
{
type: 'input',
dataKey: 'name',
placeholder: '請輸入param',
validate: ['required'],
}
])
}
</p>
}這樣就可以在container內(nèi)嵌套組件配置,實(shí)現(xiàn)更復(fù)雜的表單組件。 JSON表單提交數(shù)據(jù)非實(shí)時(shí)表單提交非實(shí)時(shí)表單提交數(shù)據(jù),就是在表單輸入完畢后,點(diǎn)擊提交按鈕統(tǒng)一提交所有的數(shù)據(jù),其提交的方式如下: function handleClick() {
this.FormRefs.getValue((valid, data) => {
// valid 表示校驗(yàn)結(jié)果,false表示校驗(yàn)不通過
})
}實(shí)時(shí)表單提交實(shí)時(shí)表單的提交首先需要注冊提交函數(shù): componentDidMount(){
this.FormRefs.registerSubmit((valid, data) => {
console.log(valid, data)
})
}接著在配置里設(shè)置允許實(shí)時(shí)提交的字段: {
formKey: '',
realTimeSubmit: true
}如果需要在某些表單組件里自定義是否實(shí)時(shí)提交,需要在組件配置里設(shè)置阻止實(shí)時(shí)提交字段為true: {
dataKey: '',
preventSubmit: true
}JSON表單的應(yīng)用場景表單分類a. 按復(fù)雜度分類 JSON表單最適合的應(yīng)用場景是簡單表單,它可以用極少的代碼,快速的構(gòu)建出表單來,對于復(fù)雜類型的表單,JSON表單需要使用container來構(gòu)建復(fù)雜的表單組件、處理復(fù)雜的控制邏輯,其代碼量優(yōu)勢雖然并不明顯,但是JSON表單可以使其代碼清晰,將表單組件和表單邏輯徹底解耦,便于抽離和維護(hù),便于共享常用組件,也帶來不少的好處。 到目前為止,JSON表單適合大部分的表單應(yīng)用場景。 JSON表單解決的問題
在我的項(xiàng)目,我嘗試了使用原始表單和JSON表單兩種方式來實(shí)現(xiàn)同一個(gè)表單頁,原始表單我編寫了600多行的代碼,而在JSON表單中,只有不到150行。 以上就是JSON生成Form表單的詳細(xì)解析(代碼實(shí)例)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章! 網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語,涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!