1. 程式人生 > >ElementUI的form表單驗證事件

ElementUI的form表單驗證事件

用過了elementUi的表單驗證、表單提交之後,個人覺得不是太建議使用。第一:和我們自己寫js的繁瑣程度差不多,第二,還要讀文件增加了學習時間和成本。
廢話不多說,直接上程式碼

html:注意1:程式碼中的:model顧名思義是我們雙向繫結的資料,而ref=”user1”,我們可以把form表單看成是一個類,那麼這個類的物件名字就是我們用ref指定的名字,這個名字會在js中呼叫elementUI的原生態方法中用到,而relus則是我們自定義校驗的規則,定義在js的data裡。
注意2:若要使用校驗則必須在每個中設定prop屬性,該屬性的名字必須的和relus中定義的校驗規則中對應的屬性名字一樣

 <el-row>
            <!--註冊彈框-->
            <el-dialog
                class="dialogRegist"
                title="加入武林"
                :visible.sync="dialogVisible"
                width="50%"
                center="true"
        >
            <span>
                <el-form
:model="user1" ref="user1" label-width="80px" :rules="rules">
<el-form-item label="姓名" prop="name"> <el-input v-model="user1.name" style="width:480px" placeholder="少俠,行走江湖,取個藝名吧"></el-input> </el-form-item> <el-form-item
label="性別">
<el-radio-group v-model="radio"> <el-radio :label="1"></el-radio> <el-radio :label="2"></el-radio> <el-radio :label="3"></el-radio> </el-radio-group> </el-form-item> <el-form-item label="地址"> <el-cascader expand-trigger="hover" :props="defaultProps" :options="addressList" v-model="user1.address" width="480px" > </el-cascader> </el-form-item> <el-form-item label="電話" prop="phone"> <el-input v-model="user1.phone" style="width:480px" placeholder="請輸入電話"></el-input> <!-- @blur="isPhone"--> </el-form-item> <el-form-item label="密碼" prop="password"> <el-input v-model="user1.password" style="width:480px" placeholder="請設定密碼"></el-input> <!-- @blur="isPhone"--> </el-form-item> <el-form-item label="確認密碼" prop="rePassword"> <el-input v-model="user1.rePassword" style="width:480px" placeholder="請再次輸入密碼"></el-input> <!-- @blur="isPhone"--> </el-form-item> <!--<el-form-item label="郵箱"> <el-input style="width:480px" placeholder="請輸入郵箱"></el-input> </el-form-item>--> <el-form-item label="頭像"> <el-upload class="upload-demo" ref="upload" :action="api.uploadImg" :auto-upload="false" list-type="picture" :file-list="fileList" :on-error="uploadError" :on-success="uploadSuccess" :limit="1" > <el-button slot="trigger" size="small" type="primary">選取檔案</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上傳到伺服器</el-button> <div slot="tip" class="el-upload__tip">只能上傳jpg/png檔案,且不超過500kb</div> </el-upload> </el-form-item> <el-form-item> <el-checkbox v-model="checked"></el-checkbox>同意<el-button @click="dialogVisible2=true" type="text">武林協議</el-button>方可加入武林 </el-form-item> </el-form> </span> <span slot="footer" class="dialog-footer"> <el-button @click="resetForm('user1')">重 置</el-button> <el-button @click="submitForm('user1')" type="primary" >確 定</el-button> <!--<el-button @click="test" type="primary" >確 定</el-button>--> </span> </el-dialog> <!--協議彈框--> <el-dialog title="武林協議" :visible.sync="dialogVisible2" width="50%" center="true" > <span> <el-form ref="form" label-width="80px" > <el-form-item > <el-input type="textarea" :rows="8" v-model="declaration" > </el-input> </el-form-item> <el-form-item> <el-checkbox v-model="checked"></el-checkbox>同意<el-button type="text">武林協議</el-button>方可加入武林 </el-form-item> </el-form> </span> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible2=false" type="danger" >關閉</el-button> </span> </el-dialog> </el-row>

js程式碼,在js檔案的data裡定義。
注意1:若是值驗證資料是否為空,那麼{required: true, message: ‘請輸入名諱’, trigger: ‘blur’},就可以,這是elementUI幫我們定義好的。如果有其他的需求,比如手機號,兩次密碼是否一樣等,請看js程式碼,程式碼中都有。
注意2:寫的時候注意rules中每個屬性的格式rules:{屬性名稱1:[{驗證規則1},{驗證規則2},,,],屬性名稱2:[],,,}
注意3:丟擲驗證提示資訊,只要在回撥函式裡定義一個Error的類即可,如callback(new Error(‘手機號碼格式不正確!’))
注意4:例如如下程式碼中驗證兩次密碼是否正確的時候,當兩次不一樣的時候是一個if,之後還要再有一個else,else裡面就只有一個callback();
即可(我就是被坑在這裡了,沒有寫else,然後校驗不同過可以走到函式裡,但是校驗通過了卻怎麼也進不到函式中去。),因為,你驗證不正確有提示,那你驗證正確了,肯定也有返回值啊,這個返回值就是我們在進行表單提交的時候,的一個boolean型別的返回值,如果rules所有的屬性都驗證通過那麼它會返回一個true的屬性,此時才允許提交,否則不允許表單提交。當有至少1條資料驗證不同過的時候,它會返回一個boolean欄位,和校驗為通過的欄位。

 rules: {
            name: [
                {required: true, message: '請輸入名諱', trigger: 'blur'},
                {min: 1, max: 15, message: '長度在 1 到 15 個字元', trigger: 'blur'},
                  {
                    validator: function (rule, value, callback) {

                        $.ajax({
                            type:"post",
                            url:app.api.findUserByName,
                            dateType:"json",
                            contentType:'application/json',
                            data:JSON.stringify(app.user1),
                            success:function(result){
                               if(!result.success){
                                   callback(new Error(result.data))
                               } else {
                                   callback();  // 一定要有,這是表單校驗成功後的回撥,會返回一個boolean值,即true
                               }
                            }
                        });


                    }, trigger: 'blur'
                }
            ],
            phone: [
                {required: true, message: '請輸入手機號碼', trigger: 'blur'},
                {
                    validator: function (rule, value, callback) {
                        var MobileRegex = /^[1][3,4,5,7,8][0-9]{9}$/;
                        if (!MobileRegex.test(value)) {
                            callback(new Error('手機號碼格式不正確!'))  // 這裡錯誤的資訊只要呼叫callback回撥函式,然後在函式裡newerror填寫錯誤資訊即可
                        } else {
                            callback();  // 一定要有,這是表單校驗成功後的回撥,會返回一個boolean值,即true
                        }
                    }, trigger: 'blur'
                }
            ],
            address:[
                {required: true, message: '請選擇地址', trigger: 'blur'},
            ],
            password:[
                {
                    validator:function (rule,value,callback) {
                        if(value === ''){
                                callback(new Error("請輸入密碼"));
                        }else{
                            callback();
                        }
                    }
                }
            ],
            rePassword:[
                {
                    validator:function (rule,value,callback) {
                        if(value === ''){
                            callback(new Error("請輸入密碼"));
                        }else{
                            if(value !== app.user1.password){
                                callback(new Error('兩次密碼輸入不一致'));
                            }else{
                                callback();
                            }
                        }
                    }
                }
            ],
        },

js函式:注意1:上面提到的ref這裡的refsformref調refs.user1.方法名,其實也不難理解,就是物件點方法名。
注意2:在重置表單的時候,就只能重置rules中校驗的屬性,沒有校驗的不能清空(我們可以自己清空)
注意3:上面說的回撥函式,與這裡的 this.$refs[formName].validate。的validate向對應,回撥函式返回的資料,就是validate函式的引數

     // 註冊重置表單
        resetForm:function () {
            this.$refs['user1'].resetFields(); // 將表單中繫結的變數也清空了
        },
        // 提交表單
        submitForm:function (formName) {

            alert("提交...");
            this.$refs[formName].validate(function (valid,object) { // 是否校驗成功,和未成功的欄位
                console.log(valid);
                /*debugger*/
                if(valid){
                    //  表單中所有有驗證的且已經通過的,就可以提交了
                    if(app.checked){
                        $.ajax({
                            type:"post",
                            url:app.api.addUserUrl,
                            dateType:"json",
                            contentType:'application/json',
                            /*contentType : 'application/x-www-form-urlencoded',*/
                            data:JSON.stringify(app.user1),
                            success:function(result){
                                alert("成功");
                            }
                        });
                    }else{
                        alert("請同意協議");
                    }
                }
               else {
                    alert("提交失敗");
                    console.log('error submit!!');
                    //return false; // 有任何一項沒有通過驗證表單就不能提交
                }
            });
        },

controller

 @RequestMapping("/ptUser/addPtUser.do")
    public void addUser(@RequestBody  PtUser user){
        ptUserService.insert(user);  
    }

執行截圖
這裡寫圖片描述

ps:這幾天發燒感冒又是腸胃炎的,身體才是第一位,大家工作的平時還是要好好鍛鍊身體的