form-create 是一個能夠經過 JSON 生成具備動態渲染、數據收集、驗證和提交功能的表單生成組件。支持3個UI框架,而且支持生成任何 Vue 組件。內置20種經常使用表單組件和自定義組件,再複雜的表單均可以輕鬆搞定。css
2.5版本主要更新了一下功能:vue
TypeScript
nextTick
方法,設置渲染後的回調effect
type
control
支持配置規則插入位置control
符合條件的都會生效,以前版本只能生效第一個prefix
, suffix
update
配置,value
發送變化後觸發wrap
配置項,配置FormItem
object
組件title
,info
組件wangEditor
value.sync
獲取雙向綁定的 formData
根據本身使用的 UI 安裝對應的版本git
element-ui
版本github
npm i @form-create/element-ui
iview@2.x|3.x
版本正則表達式
npm i @form-create/iview
iview/view-design@4.x
版本typescript
npm i @form-create/iview4
ant-design-vue@1.5+
版本npm
npm i @form-create/ant-design-vue
本文以
element-ui
爲例element-ui
import Vue from 'vue' import ELEMENT from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import formCreate from '@form-create/element-ui' Vue.use(ELEMENT) Vue.use(formCreate)
在線示例api
<template> <div id="app1"> <form-create v-model="fApi" :rule="rule" :option="option" :value.sync="value"></form-create> </div> </template>
export default { data() { return { //實例對象 fApi: {}, //表單數據 value: {}, //表單生成規則 rule: [ { type: 'input', field: 'goods_name', title: '商品名稱' }, { type: 'datePicker', field: 'created_at', title: '建立時間' } ], //組件參數配置 option: { //表單提交事件 onSubmit: function (formData) { alert(JSON.stringify(formData)) } } } } }
form-create 支持的在表單內部生成任何 vue 組件
例如生成一個el-button
組件:
{ //type 能夠是內置組件名稱,也能夠是vue組件名稱或者 html 標籤 type: 'el-button', //... children: ['按鈕內容'] }
生成一個 html 標籤
{ //type 能夠是內置組件名稱,也能夠是vue組件名稱或者 html 標籤 type: 'span', //... children: ['span內容'] }
注意! 生成的組件必須掛載到全局或者經過 form-create 掛載
經過 Vue 掛載
Vue.component(component.name, component);
經過 form-create 掛載
formCreate.component(component.name, component);
經過設置配置項col
或者柵格組件能夠實現對組件的佈局
經過配置項col
設置組件佈局,設置一行顯示兩個組件
[ { type:'input', field:'input1', title:'input1', col:{span:12} },{ type:'input', field:'input2', title:'input2', col:{span:12} }, ]
經過柵格組件設置一行顯示三個組件
{ type:'el-row', children: [ { type:'el-col', props:{ span:8 }, children: [{type:'input',field:'input1',title:'input1'}] }, { type:'el-col', props:{ span:8 }, children: [{type:'input',field:'input1',title:'input1'}] }, { type:'el-col', props:{ span:8 }, children: [{type:'input',field:'input1',title:'input1'}] } ] }
經過生成規則的prefix屬性配置組件的前綴,suffix屬性配置組件的後綴
{ type:'input', field:'text', title:'text', prefix:'prefix', suffix:'suffix', }
設置先後綴爲自定義組件
{ type:'input', field:'text', title:'text', value:'default', prefix:{ type:'ElButton', children:['prefix'] }, suffix:{ type:'ElButton', children:['suffix'] }, }
能夠經過control配置項實現經過組件的值控制其餘組件是否顯示
例如當評價小於3星時輸入差評緣由
{ type:'rate', field: 'star', title:'評分', value:5, control:[ { handle(val){ return val < 3 }, rule:[ { type:'input', field:'info', title:'差評緣由', value:'default info', } ] } ] }
參數 | 說明 | 類型 |
---|---|---|
value | 當組件的值和value 全等時顯示rule 中的組件 |
string|Number|Bool |
handle | 當handle 方法返回true 時顯示rule 中的組件 |
Function |
rule | 該組件控制顯示的組件 | Array |
append | 設置rule 中的規則追加的位置 |
string |
prepend | 設置rule 中的規則前置插入的位置 |
string |
child | 設置rule 是否插入到指定位置的children中,默認添加到當前規則的 children 中 |
Boolean |
注意! handle
優先級大於value
,全部符合條件的control
都會生效
能夠經過 validate 配置項設置組件的驗證規則,自定義的表單組件也支持校驗
例如設置input 組件必填
{ type:'input', //... validate:[{required:true, type:'string', message:'請個輸入內容'}] }
參數 | 說明 | 類型 | 默認值 |
---|---|---|---|
enum | 枚舉類型 | string | - |
len | 字段長度 | number | - |
max | 最大長度 | number | - |
message | 校驗文案 | string | - |
min | 最小長度 | number | - |
pattern | 正則表達式校驗 | RegExp | - |
required | 是否必選 | boolean | false |
transform | 校驗前轉換字段值 | function(value) => transformedValue:any | - |
type | 內建校驗類型,可選項 | string | 'string' |
validator | 自定義校驗 | function(rule, value, callback) | - |
whitespace | 必選時,空格是否會被視爲錯誤 | boolean | false |
注意!type
須要根據組件的value
類型定義
下列是經常使用的方法
覆蓋方式,未定義的字段會設置爲 null
type coverValue = (formData:{[field:string]:any}) => void
fApi.coverValue({goods_name:'HuaWei'})
合併方式,未定義的字段不作修改
interface setValue { (formData:{[field:string]:any}): void (field:string, value:any): void }
fApi.setValue({goods_name:'HuaWei'})
別名方法changeValue
, changeField
interface hidden { //隱藏所有組件 (status:Boolean):void //隱藏指定組件 (status:Boolean, field:string):void //隱藏部分組件 (status:Boolean, field:string[]):void }
fApi.hidden(true, 'goods_name')
獲取組件隱藏狀態
type hiddenStatus = (field:string)=>Boolean
const status = fApi.hiddenStatus('goods_name')
interface getRule { (field:string):Rule (field:string, origin: true): FormRule }
const rule = fApi.getRule('goods_name')
前置插入
interface prepend { //插入到第一個 (rule:FormRule):void //插入指定字段前面 (rule:FormRule, field:string):void //插入到指定字段 children 中 (rule:FormRule, field:string, child:true):void }
fApi.prepend({ type:"input", title:"商品簡介", field:"goods_info", value:"", props: { "type": "text", "placeholder": "請輸入商品簡介", }, validate:[ { required: true, message: '請輸入商品簡介', trigger: 'blur' }, ], }, 'goods-name')
後置追加
interface append { //插入到最後一個 (rule:FormRule):void //插入指定字段後面 (rule:FormRule, field:string):void //插入到指定字段 children 中 (rule:FormRule, field:string, child:true):void }
fApi.append({ type:"input", title:"商品簡介", field:"goods_info", value:"", props: { "type": "text", "placeholder": "請輸入商品簡介", }, validate:[ { required: true, message: '請輸入商品簡介', trigger: 'blur' }, ], }, 'goods-name')
type removeRule = (rule:FormRule) => FormRule
const rule = {type:'input', /** ... **/} fApi.removeRule(rule)
type validate = (callback:(...args:any[]) => void)=> void
fApi.validate((valid, fail) => { if(valid){ //todo 表單驗證經過 }else{ //todo 表單驗證未經過 } })
type validateField = (field, callback:(...args:any[]) => void)=> void
fApi.validateField('goods_name', (valid, fail) => { if(valid){ //todo 字段驗證經過 }else{ //todo 字段驗證未經過 } })
interface formData { //獲取所有數據 (): {[field:string]:any } //獲取部分字段的數據 (field:string[]): {[field:string]:any } }
const formData = fApi.formData()
type submitBtnProps = (props:Object) => void
fApi.submitBtnProps({disabled:true})
快捷操做:
fApi.btn.loading(true)
設置提交按鈕進入loading狀態fApi.btn.disabled(true)
設置提交按鈕禁用狀態fApi.btn.show(true)
設置提交按鈕顯示狀態type resetBtnProps = ( props:Object) => void
fApi.resetBtnProps({disabled:true})
快捷操做:
fApi.resetBtn.loading(true)
設置重置按鈕進入loading狀態fApi.resetBtn.disabled(true)
設置重置按鈕禁用狀態fApi.resetBtn.show(true)
設置重置按鈕顯示狀態type hideForm = (hide:Boolean)=>void
fApi.hideForm(true)
type submit = (success: (formData: FormData, $f: fApi) => void, fail: ($f: fApi) => void)=> void
fApi.submit((formData, fapi) => { //todo 提交表單 },()=>{ //todo 表單驗證未經過 })
若是對您有幫助,您能夠在GitHub上點 'Star' 支持一下 謝謝!