form组件封装 入门学习-17

109 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

form-item对象配置校验规则

由于数据是循环出来的,只需要在el-form-item上定义rules就可以,

  <el-form :model="field" :rules="rules" ref="form"  label-width="80px">
    <templete v-for="item in form_item" :key="item.prop">
      <el-form-item
        v-if="item.type === 'input'"
        :label="item.label"
        :prop="item.prop"
        :rules="item.rules"
      >
        <el-input v-model="field[item.prop]"></el-input>
      </el-form-item>

    </templete>
  </el-form>

想在那个上面定义规则,只需要在form_item中定义,我们在名字上面定义一下

        form_item: [
            {
                type: 'input', 
                prop: 'name', 
                label: "姓名",
                rules: [
                    {required: true, message: "必填"}
                ]

            },
            {type: 'select', prop: 'gender', label: "性别"}
        ],

23c7fd13c9e975f76485bd0376c3b48.png

自定义校验规则

利用validator字段去弄一个自定义函数 validateName(),通过callback返回 请输入10

  data() {
    const validateName = (rule, value, callback) => {
        if(value && value !== '10') {
            callback(new Error("请输入10"))
        } else {
        callback()
        }
        
        
    }
    return {
        form_item: [
            {
                type: 'input', 
                prop: 'name', 
                label: "姓名",
                rules: [
                    {min: 3, max: 10, message: "请输入3~10个字符", trigger: 'change'},
                    { validator: validateName, trigger: 'blur'}
                ]

            },
            {type: 'select', prop: 'gender', label: "性别"}
        ],
      
       
    }
  }

1bcdddb8f511b2c8ae9dd6d02e4b6e7.png

配置phone手机号校验规则

像这种的就可以使用一些 正则表达式 这里我们用 /^[1][3,4,5,7,8,9][0-9]{9}$/

     form_item: [
        {
          type: "input",
          prop: "name",
          label: "手机号",
          rules: [
            { required: true, message: "请输入手机号码", trigger: "blur" },
            {
              required: true,
              pattern: /^[1][3,4,5,7,8,9][0-9]{9}$/,
              message: "请输入正确的手机号码",
              trigger: "blur",
            },
          ],
        },
        { type: "select", prop: "gender", label: "性别" },
      ],

6d3dae59574c55e01f1ebfbf1e4a1a4.png

附完整代码

//父组件
<template>
  <a-form :item="form_item" :field="form_field" :rules="form_rules"></a-form>
</template>
<script>
export default {
  name: "Home",
  components: {
    "a-form": () => import("@/components/form/index"),
  },
  data() {
    const validateName = (rule, value, callback) => {
      if (value && value !== "10") {
        callback(new Error("请输入10"));
      } else {
        callback();
      }
    };
    return {
      form_item: [
        {
          type: "input",
          prop: "name",
          label: "手机号",
          rules: [
            { required: true, message: "请输入手机号码", trigger: "blur" },
            {
              required: true,
              pattern: /^[1][3,4,5,7,8,9][0-9]{9}$/,
              message: "请输入正确的手机号码",
              trigger: "blur",
            },
          ],
        },
        { type: "select", prop: "gender", label: "性别" },
      ],
      form_field: {
        name: "初始化",
        gender: "",
      },
      form_rules: {
        // name: [
        //     {required: true, message: "必填"}
        // ]
      },
    };
  },
};
</script>
//组件
<template>
  <el-form :model="field" :rules="rules" ref="form"  label-width="80px">
    <templete v-for="item in form_item" :key="item.prop">
      <el-form-item
        v-if="item.type === 'input'"
        :label="item.label"
        :prop="item.prop"
        :rules="item.rules"
      >
        <el-input v-model="field[item.prop]"></el-input>
      </el-form-item>
      <el-form-item
        v-if="item.type === 'select'"
        :label="item.label"
        :prop="item.prop"
        :rules="item.rules"
      >
        <el-select v-model="field[item.prop]"></el-select>
      </el-form-item>
    </templete>
  </el-form>
</template>
<script>
export default {
  name: "Form",
  props: {
    item: {
      type: Array,
      default: () => [],
    },
    field: {
        type: Object,
        default: () => ({})
    },
    rules: {
        type: Object,
        default: () => ({})
    }
  },
  data() {
    return {
      form_item: [],
      form: {
        name: "",
      },
    };
  },
  beforeMount() {
    this.form_item = this.item;
  },
  methods: {
    onSubmit() {
      console.log("submit!");
    },
  },
};
</script>