element-ui表单验证总结

element-ui的表单验证包括三个元素

rules:表示验证的规则
prop:某个字段所在的位置
v-model:某个字段填写的值

一.rules设置的位置

1.在<el-form>中设置全部的rules

<el-form :model="dataForm" ref="dataForm1" label-width="150px" :rules="rules">

2.在<el-form-item>中设置单独的rules

<el-form-item 
  label="消息" 
  :rules="[ { required: true, message: '消息不能为空', trigger: 'blur' },
   { validator: JSONStringCheck, trigger: 'blur' }]" 
  :prop="message" 
>
</el-form-item>

二.rules的值

1.必填设置,required
2.自己写逻辑或正则验证
(1).写方法验证

a.在<el-form-item>中引入方法(验证是否为JSON格式)

<el-form-item
    :label="消息"
    :rules="[
        { required: true, message: '消息不能为空', trigger: 'blur' },
        { validator: JSONStringCheck, trigger: 'blur' }
    ]"
    :prop="message"
>
    <el-input v-model="dataForm.message" type="textarea" :rows="5"></el-input>
</el-form-item>
methods: {
      JSONStringCheck(rule, value, callback) {
        if (!this.isJson(value)) {
          callback(new Error("请输入正确的json格式"));
        } else {
          callback();
        }
      },
      isJson(data) {
        if (typeof data === 'string') {
          try {
            var obj = JSON.parse(data)
            if (typeof obj === 'object' && obj) {
              return true
            } else {
              return false
            }
          } catch (e) {
            return false
          }
        }
      },
}

b.在data中引入方法(验证是否为大于0的数字)

export default {
    data() {
      const validatorNumber = (rule, value, callback)=> {
        if (typeof value === 'string'&&!value.match(/^[0-9]*$/)) {
          callback(new Error('请输入数字'));
        } else {
          if(value>0) {
            callback();
          } else {
            callback(new Error('请输入大于0的数字'));
          }
        }
      }
      return {
        rules: {
          maxPv: [
            {
              required: true, message: '请输入访问次数上限', trigger: 'blur',
            },
            { validator: validatorNumber },
          ],
        },
      };
    },
(2).正则表达式可直接写在rules中
rules: {
    sharePageShareUrl: [
      {
        pattern: /(http|https):\/\/([\w.]+\/?)\S*/,
        message: 'XXX格式有误',
        trigger: 'blur'
      },
      {required: true, message: 'XXX不能为空', trigger: 'blur'}
    ],
  },
3. trigger是触发验证的事件

blur:当输入框<el-input>失去焦点时触发,但下拉框<el-select>不会触发
change:值改变时,通常用于下拉框<el-select>,<el-input>输入框也会触发

4. 输入值的类型type

字符串:设置type:string,默认
数字:利用监听键盘事件,只能输入数字,<el-input v-model="dataForm1.name" oninput ="value=value.replace(/[^\d.]/g,'')" ></el-input>
时间类型:设置type:date,通常用于时间选择器,<el-date-picker type="date" placeholder="选择日期"></el-date-picker>
数组类型:设置type:array,通常用于多选框,<el-checkbox-group>

三.动态增减表单(数组表单),主要注意对prop的设置

<div class="flex" v-for="(item, index) in dataForm1.messageList">
  <div style="width: 100%;">
    <el-form-item
      :key="`${index}message`"
      :label="`消息JSON ${index + 1}`"
      :rules="[
        { required: true, message: '消息不能为空', trigger: 'blur' },
        { validator: JSONStringCheck, trigger: 'blur' }
      ]"
      :prop="'messageList.'+index+'.message'"
    >
      <el-input v-model="item.message" type="textarea" :rows="5" placeholder=""></el-input>
    </el-form-item>
    <el-form-item
      :key="`${index}immediatelyState`"
      :label="`推送时间 ${index + 1}`"
      :rules="[{ required: true, message: '推送时间不能为空', trigger: 'blur' }]"
      :prop="'messageList.'+index+'.immediatelyState'"
    >
      <el-radio-group v-model="item.immediatelyState">
        <el-radio label="1">立即推送</el-radio>
        <el-radio label="0">延时发送</el-radio>
      </el-radio-group>
      <div v-if="item.immediatelyState === '0'" style="display: inline-block;margin-left: 10px;">
        <el-input v-model="item.hour" style="width:60px;"></el-input>
        时
        <el-input v-model="item.min" style="width:60px;"></el-input>
        分
        <el-input v-model="item.second" style="width:60px;"></el-input>
        秒
      </div>
    </el-form-item>
  </div>
  <div class="del">
    <el-button type="danger" size="small" @click="delMessage(index)">删除</el-button>
  </div>
</div>

这里注意,如果是先获取数据,在进行新增或删除的操作时会出现不在页面中及时动态增减,解决办法:

addMessage() {
  this.dataForm1.messageList.push({message: '', immediatelyState: '', second: 0, hour: 0, min: 0})
  //对整个对象重新赋值
  this.dataForm1 = {...this.dataForm1}
},
delMessage(index) {
  this.dataForm1.messageList.splice(index, 1)
  this.dataForm1 = {...this.dataForm1}
},
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容