form组件封装 入门学习-15

102 阅读1分钟

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

了解基本元素

我们在封装前,先了解一下表单域中各种类型的表单控件 包括 Input、Select、Checkbox、Radio、Switch、DatePicker、TimePicker 老样子,我们新建文件夹等一系列操作

<template>
    <a-form></a-form>
</template>
<script>
export default {
    name: "Home",
  components: {
    "a-form": () => import("@/components/form/index"),
  },
}
</script>

接下来利用Element的form表单来进行二次封装,具体一些引入的问题,看前面的文章有,具体就不细说了

<template>
    <el-form ref="form" :model="form" label-width="80px">
  <el-form-item label="活动名称">
    <el-input v-model="form.name"></el-input>
  </el-form-item>

  <el-form-item>
    <el-button type="primary" @click="onSubmit">立即创建</el-button>
    <el-button>取消</el-button>
  </el-form-item>
</el-form>
</template>
<script>
export default {
    name: 'Form',
     data() {
      return {
        form: {
          name: '',
        }
      }
    },
    methods: {
      onSubmit() {
        console.log('submit!');
      }
    }
}
</script>

视图就已经出来了,最基础的我们就先了解一下 1a9453a3df32ec6650bb4330d4235b8.png

定义item渲染表单项

通过item将自定义的数据传给组件

 <a-form :item="form_item"></a-form>

自定义的数据

  data() {
    return {
        form_item: [
            {type: 'input', label: "活动名称"},
            {type: 'select', label: "活动区域"}
        ]
    }
  }

组件props接受,接受后不要第一时间就在dom循环,先定义一个变量赋值,在去循环

    props: {
        item: {
            type: Array,
            default: ()=> []
        }
    },
     data() {
      return {
        form_item: [],
        form: {
          name: '',
        }
      }
    },
    beforeMount(){
        this.form_item = this.item
    },

这样我们自定义的的数据就出来了

    <el-form ref="form" :model="form" label-width="80px">
  <el-form-item v-for="item in form_item" :key="item.label" :label="item.label">
    <el-input  v-model="form.name"></el-input>
  </el-form-item>
</el-form>

字段绑定

先定义两条数据

        form_item: [
            {type: 'input', prop: 'name', label: "姓名"},
            {type: 'select', prop: 'gender', label: "性别"}
        ]

v-if去判断 type 的类型

  <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="form.name"></el-input>
      </el-form-item>
      <el-form-item
        v-if="item.type === 'select'"
        :label="item.label"
      >
        <el-select v-model="form.name"></el-select>
      </el-form-item>
    </templete>
  </el-form>
  

字段就绑定好了 看封装table一样 ad977b89f7eb82318b8563180f5aa6c.png