亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue和iview結(jié)合動態(tài)生成表單實例

 更新時間:2022年10月10日 17:00:42   作者:遇見y2021  
這篇文章主要介紹了vue和iview結(jié)合動態(tài)生成表單實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在項目中,表單作為用戶輸入占用很重要的一部分,目前的前端框架,基本對表單進行了一些簡單的封裝,如果輸入項很多,以iview為例,會有一大堆的類似:

<FormItem label="Input">
? ? ? ? ? ? <Input v-model="formItem.input" placeholder="Enter something..."></Input></FormItem>

這樣的標簽,現(xiàn)在將用

{//input輸入框
            type:'InputNumber',
            placeholder:"請數(shù)量",
            label:'數(shù)量',
            value:1,
            props:'num',
            isRequire:true,
            emptyTip:'數(shù)量不能為空'
          },

這樣的輸入來簡化,配置表單的生成。

一、構(gòu)建myform組建

新建myForm.vue文件

1、結(jié)合vue和iveiw的框架,根據(jù)需求,對表單分一列,兩列,多列展示,需要設(shè)置變量cols,表單項前面的文字寬度也不一樣,因此還需設(shè)置變量labelWidth,渲染表單(展示你想展示的內(nèi)容),需設(shè)置變量formDatas,最后,用戶完成輸入后還需獲取表單數(shù)據(jù),需要設(shè)置變了formDataModel。到此,配置表單大致需要的變量已基本設(shè)置完成。

大致代碼如下:

<Form ref="formValidate" :label-width="labelWidth" :model="formDataModel" class="leftLabel">
? ? <Row :gutter="32">
? ? ? <Col :span="cols" v-for="(item,index) in formDatas" :key="index">
? ? ? ? <myFormItem ?:schema = "item" :key="index" :formObj="formDatas"></myFormItem>
? ? ? </Col>
? ? </Row>
</Form>

2、一般情況下每個表單的下面都會有操作,比如確定,取消等,這樣我們可以用slot插入來實現(xiàn)不同引用頁面的功能

<section>
? ? ? <slot name="btnCancel" :cancelFormBtn="cancelForm"><Button type="default">取消</Button></slot>
? ? ? <slot name="btnSave" :saveFormBtn="saveForm"><Button type="primary">確定</Button></slot>
</section>

這樣myform組件就大致完成,在上面的myform組建中,有一個myFormItem 的組建,下面我們就來實現(xiàn)myFormItem。

二、構(gòu)建myFormItem組建

新建myFormItem.vue文件

myFormItem中,由于表單項有很多種,包括input,select,checkBox等,如果在這個組建中用v-if來控制顯示,這樣這個頁面很臃腫,因此,采用函數(shù)式組建來和render函數(shù)來動態(tài)構(gòu)建不同類型的表單

因此myFormItem組建代碼大致如下:

<my-contrl :schema="schema" :formObj="formObj"></my-contrl>

三、構(gòu)建函數(shù)式組件mycontrl組件

新建myContrl.js文件

函數(shù)式組件的大致結(jié)構(gòu)如下,首先根據(jù)context中的類型進行分發(fā),然后再用渲染函數(shù)渲染出來

function getControl(context){
?? ?let {type,label,placeholder,value} = context.props.shema;
?? ?return {type,label,placeholder,value}
}
export default{
?? ?functional:true,
?? ?props:{
?? ?schema:Object
?? ?},
?? ?render(h,context){
?? ??? ?let {type,label,placeholder,value} = getControl(context);
?? ? ? ?return h('FormItem',{
?? ? ? ??? ??? ? props:{
? ? ? ? ?? ??? ??? ?label:label,
? ? ? ?? ??? ??? ??? ?},
?? ? ? ? ? },[
?? ? ? ??? ?h(type,{
?? ? ? ??? ?placeholder:placeholder,
? ? ??? ??? ?value:value,
?? ? ? ??? ?})
?? ? ? ?])
?? ?}
}

中間需注意的小細節(jié):

1、由于一般設(shè)置必填項和非必填項的樣式不一致,如果要用到iview里面的樣式,需要在formItem下加class:‘ivu-form-item-required’,代碼如下:

class:{
? ? ? ? 'ivu-form-item-required':isRequire,
? ? ? },

2、如果表單項是select,checkBox等,在select下面會有option屬性,因為都是動態(tài)輸入的值,所以,要用render函數(shù)動態(tài)生成數(shù)組

keyValue.map(item=>{
? ? ? ? return h(keyData,{
? ? ? ? ? props:{
? ? ? ? ? ?[keyData==='Option'?'value':keyData==='Button'?'icon':'label']:item.key,
? ? ? ? ? }
? ? ? ? },item.label)
? ? ? })

到此,靜態(tài)頁面的渲染也就完成了。

四、用戶輸入的時候需要對表單項中進行各種驗證或者邏輯

為了實現(xiàn)此功能,一般我們用到vue中的混入,將公用的驗證,邏輯寫到同一個文件中,再將每個表單中單獨的邏輯放到引用這個表單的vue中。

因此在mycontrl.js文件的render函數(shù)中,要為每個表單項注冊一個on-change或on-blur事件,然后觸發(fā)對應(yīng)的函數(shù),并且設(shè)置此表單的對象的值。

1、設(shè)置表單項的值

context.parent.setValue(context.data.attrs.formObj,props,val);

2、判斷是否必填進行操作

if(val==='' || val===null || val.length===0){
? ? context.parent.Validate('rule-empty',`${label}id`,emptyTip);
? ? ?return;
? ?}else{
? ? ?context.parent.ValidateHide('rule-empty',`${label}id`)
}

3、規(guī)則驗證判斷

for(let r = 0;r<rules.length;r++){
?let flag = rules[r].valide(val);
? if(flag){
? ?context.parent.ValidateHide(`rule-${rules[r].name}`,`${label}id`)
? ? }else{
? ? context.parent.Validate(`rule-${rules[r].name}`,`${label}id`,rules[r].tip);
? ? ?break;
? ?}
? }
?return;

4、邏輯判斷

logicRelation(val)

像類似前面的Validate,ValidateHide,setValue這些函數(shù),都放在混入的js函數(shù)中,作為公共函數(shù),而邏輯,規(guī)則下的驗證函數(shù)就放在了每個配置表單的配置項里面了。以上所有的判斷都寫作on-blur或on-change中

五、表單輸入完成獲取表單中的值

這個寫在myForm.vue中

1、在計算屬性中,取得這個表單的項和值

computed:{
?? ?formDataModel:function(){
?? ?return this.getValue(this.formDatas);
? ? ? }
? ?}

2、點擊確定按鈕的時候,將這個值返回到傳入確定按鈕的這個函數(shù)中

?? ?saveForm(fn,errFn){
? ? ? ? let _this = this;
? ? ? ? if(_this.isValidData(_this.formDatas,_this.formDataModel)){
? ? ? ? ? fn(_this.formDataModel)
? ? ? ? }else{
? ? ? ? ? _this.$Message.error('表單輸入有誤!請按頁面提示輸入')
? ? ? ? ? if(errFn){
? ? ? ? ? ? errFn()
? ? ? ? ? }
? ? ? ? }
? ? ? }

3、取消按鈕,將值還原,或者是別的需要的操作

cancelForm(type,fn){
? if(type==='modify'){
? ? fn()
?}else if(type==='close'){
?this.$emit('closeModel')
? }else{
? ?this.backDefault(this.defaultValCopy,this.formDatas);
? }
}

六、在要用到表單的頁面使用

?? ??? ?<my-form :formData="formDatas" :cols="12" :labelWidth="100">
? ? ? ? ? ? <template v-slot:btnCancel ="{cancelFormBtn}">
? ? ? ? ? ? ? <Button type="default" @click="cancelFormBtn('modify',getlist)">取消</Button>
? ? ? ? ? ? </template>
? ? ? ? ? ? <template v-slot:btnSave ="{saveFormBtn}" >
? ? ? ? ? ? ? <Button type="primary" @click="saveFormBtn(save)">保存</Button>
? ? ? ? ? ? </template>
? ? ? ? ?</my-form>

配置項中的formData格式

? ? ? ?[ {
? ? ? ? ? ? type:'InputNumber',
? ? ? ? ? ? placeholder:"Web",
? ? ? ? ? ? label:'Web',
? ? ? ? ? ? value:1,
? ? ? ? ? ? props:'web',
? ? ? ? ? ? isRequire:true,
? ? ? ? ? ? emptyTip:'Web不為空'
? ? ? ? ? },
? ? ? ? ? {//select選擇框
? ? ? ? ? ? type:'Select',
? ? ? ? ? ? placeholder:"請選擇要輸入內(nèi)容",
? ? ? ? ? ? label:'記錄',
? ? ? ? ? ? data:{
? ? ? ? ? ? ? Option:[
? ? ? ? ? ? ? {key:'1',label:'記錄'},
? ? ? ? ? ? ? {key:'0',label:'不記錄'},
? ? ? ? ? ? ]
? ? ? ? ? ? },
? ? ? ? ? ? value:'1',
? ? ? ? ? ? props:'record',
? ? ? ? ? ? isRequire:true,
? ? ? ? ? ? emptyTip:'請選擇',
? ? ? ? ? ? logicRelation:this.isHideKafka
? ? ? ? ? }]

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • 實現(xiàn)Vue的markdown文檔可以在線運行的方法示例

    實現(xiàn)Vue的markdown文檔可以在線運行的方法示例

    這篇文章主要介紹了實現(xiàn)Vue的markdown文檔可以在線運行的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來打包不同域名

    vue中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來打包不同域名

    這篇文章主要介紹了vue項目中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來打包不同域名,使用npm run build --xxx,根據(jù)傳遞參數(shù)xxx來判定不同的環(huán)境,給出不同的域名配置,具體內(nèi)容詳情大家參考下本文
    2018-03-03
  • 詳解如何在Vue項目中發(fā)送jsonp請求

    詳解如何在Vue項目中發(fā)送jsonp請求

    這篇文章主要介紹了詳解如何在Vue項目中發(fā)送jsonp請求,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue.js實戰(zhàn)之組件的進階

    Vue.js實戰(zhàn)之組件的進階

    組件(Component)是 Vue.js 最強大的功能之一,之前的文章都只是用到了基本的封裝功能,這次將介紹一些更強大的擴展。這篇文章主要介紹了Vue.js實戰(zhàn)之組件進階的相關(guān)資料,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • vue-cli 自定義指令directive 添加驗證滑塊示例

    vue-cli 自定義指令directive 添加驗證滑塊示例

    本篇文章主要介紹了vue-cli 自定義指令directive 添加驗證滑塊示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Vue調(diào)用后端java接口的實例代碼

    Vue調(diào)用后端java接口的實例代碼

    今天小編就為大家分享一篇Vue調(diào)用后端java接口的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vuejs前后端數(shù)據(jù)交互之從后端請求數(shù)據(jù)的實例

    vuejs前后端數(shù)據(jù)交互之從后端請求數(shù)據(jù)的實例

    今天小編就為大家分享一篇vuejs前后端數(shù)據(jù)交互之從后端請求數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vue實現(xiàn)動態(tài)添加數(shù)據(jù)滾動條自動滾動到底部的示例代碼

    vue實現(xiàn)動態(tài)添加數(shù)據(jù)滾動條自動滾動到底部的示例代碼

    本篇文章主要介紹了vue實現(xiàn)動態(tài)添加數(shù)據(jù)滾動條自動滾動到底部的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Vue.js框架實現(xiàn)購物車功能

    Vue.js框架實現(xiàn)購物車功能

    這篇文章主要為大家詳細介紹了Vue.js框架實現(xiàn)購物車功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • VueUse功能精簡你的dependencies

    VueUse功能精簡你的dependencies

    這篇文章主要為大家介紹了VueUse功能精簡你的dependencies實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論