form组件封装 入门学习-16

127 阅读1分钟

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

优化字段绑定

一开始我们在内部绑定,控制性不怎么好,我们可以选择外部去绑定

//父组件
 <a-form :item="form_item" :field="form_field"></a-form>
        form_field: {
            name: "",
            gender: ""
        }
//form组件
  props: {
    item: {
      type: Array,
      default: () => [],
    },
    field: {
        type: Object,
        default: () => ({})
    }
   }
我们绑定需要实时响应,一开始通过监听的方式去响应有点繁琐,这下我们可以 `field`绑定到v-model上,`v-model="field[item.prop]"`,这个就是field[item.prop] === field['name'],一个动态语法
  <el-form ref="form" :model="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"
      >
        <el-input v-model="field[item.prop]"></el-input>
      </el-form-item>
      <el-form-item
        v-if="item.type === 'select'"
        :label="item.label"
      >
        <el-select v-model="field[item.prop]"></el-select>
      </el-form-item>
    </templete>
  </el-form>

这样我们就方便许多了,当我们初始化的时候也可以传一些数据

  form_field: {
            name: "初始化",
            gender: ""
        }

540c41a4dfc19619c0669cbc8796376.png

了解校验规则

Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可,我们只需要知道 :model="ruleForm",:rules="rules",prop="name"这三个东西,rules去定义验证规则,model里面对应的字段和prop里面的字段要一致

传统方式绑定校验规则

我们的字段绑定在field,model上也继续使用这个字段,通过组件传值的方式去定义rules

父组件

<a-form :item="form_item" :field="form_field" :rules="form_rules"></a-form>
   form_rules: {
            name: [
                {required: true, message: "必填"}
            ]
        }

form组件 我们在el-form是上面 定义 :rules="rules

    rules: {
        type: Object,
        default: () => ({})
    }

我们定义了一个姓名的必填项,这样就出来了

e6951aa88a094f4631656e13e3d0847.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() {
    return {
        form_item: [
            {type: 'input', prop: 'name', label: "姓名"},
            {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"
      >
        <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"
      >
        <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>