置信很多人都有过这样的代码

{  name: [    { required: true, message: '请输出流动名称', trigger: 'blur' },  ],  region: [    { required: true, message: '请抉择流动区域', trigger: 'change' }  ],}

额滴恶瓜脑膜炎上帝啊, 这是要坐实我搬砖皇帝的身份么,一个required要我写这么多代码? 我就一个必填, 你默认给我整个英文,还是

name is required

唉, 不得不想出点脑瓜仁不便不便了。
二话不说,
我包装了下el-form, 看下:

<template>  <el-form ref="form" v-bind="$attrs" :rules="defaultRules" size="small">    <slot></slot>  </el-form></template><script>import validator from "./validator";/** * Basic Form Components */export default {  inheritAttrs: false,  data() {    return {      defaultRules: {}, // Default configuration made by interception      validateList: [],    };  },  created() {    // 读取规定列表    this.readRuleList();    const arr = this.$slots.default.map(v => ({      ...v.componentOptions.propsData,      ...v.data.attrs    }));    arr.forEach(v => {      if (Object.prototype.hasOwnProperty.call(v, "required")) {        if (!this.defaultRules[v.prop]) {          this.$set(this.defaultRules, v.prop, []);        }        this.defaultRules[v.prop].push({          required: true,          message: `${v.label}不能为空`, // 重点这句          trigger: "blur"        });      }      this.validateList.forEach(val => {        if (Object.prototype.hasOwnProperty.call(v, val)) {          if (!this.defaultRules[v.prop]) {            this.$set(this.defaultRules, v.prop, []);          }          this.defaultRules[v.prop].push({            validator: validator[val](this),            trigger: "blur"          });        }      });    });  },  methods: {    validate(fn) {      return this.$refs.form.validate(fn);    },    reset() {      this.$refs.form.resetFields();    },    readRuleList() {      this.validateList = Object.keys(require("./validator/index").default);    }  }};</script>

这么用:

 <base-form>    <el-form-item prop="title" label="题目" required>              <el-input v-model="addForm.title"></el-input>            </el-form-item> </base-form>
就只有在form-item上写个 required! message默认就是题目不能为空

当然这个base-form还能够轻易加定好的属性,你看:

validator.js
/** * Verifier */export default {  mobile: () => (rule, value, callback) => {    if (!/^1[0-9]{10}$/.test(value)) {      callback(new Error("手机号码谬误"));    } else {      callback();    }  },  email: () => (rule, value, callback) => {    if (!/[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value)) {      callback(new Error("电子邮箱格局谬误"));    } else {      callback();    }  }};

你只有这么应用:

<base-form>    <el-form-item prop="title" label="题目" email>              <el-input v-model="addForm.title"></el-input>            </el-form-item> </base-form>

邮箱验证就加上去啦!

当当当然,阔以叠加

<base-form>    <el-form-item prop="title" label="题目" email required>              <el-input v-model="addForm.title"></el-input>            </el-form-item> </base-form>

ohohohohohohohoh!!

当当当当当当然, base-form是不会冲掉本来el-form的属性的, 这么炫炫的组件不copy试试吗?