# Layout 表单布局

在复杂的场景下,例如一个表单下有多个分组、块的概念,且样式排版各不同,你可能更需要原始的布局组件来实现需求。

# 使用

使用布局组件 el-form 组件的 model 属性是必须的,所有数据源都取自这里。

使用动态表单,则需要手动关联布局组件的 model-propel-form.model,且数据源必须是数组 。

点击查看代码
<template>
  <div class="demo border">
    <el-divider content-position="left">el-form 包裹</el-divider>
    <el-form :model="data" class="border" label-width="auto" ref="form">
      <!-- 内联布局 -->
      <el-divider content-position="left">agel-form-inline 内联布局</el-divider>
      <agel-form-inline :items="inlineItems"></agel-form-inline>

      <!-- 栅格布局 -->
      <el-divider content-position="left">agel-form-grid 栅格布局</el-divider>
      <agel-form-grid :items="gridItems" :span="12"></agel-form-grid>

      <!-- 描述布局 -->
      <el-divider content-position="left">agel-form-descriptions 描述布局</el-divider>
      <agel-form-descriptions :items="decItems" :column="2"></agel-form-descriptions>

      <!-- 表格编辑器布局, 需要使用 model-prop 属性关联表单数据-->
      <el-divider content-position="left">agel-form-tableditor 表格编辑器布局</el-divider>
      <agel-form-tableditor :items="tableItems" model-prop="list"> </agel-form-tableditor>

      <!-- 自定义布局 -->
      <el-divider content-position="left">custom 自定义布局</el-divider>
      <el-row type="flex" justify="space-between">
        <el-form-item prop="e1" label="姓名" :rules="{required:true,message:'必填',trigger:'blur'}">
          <el-input v-model="data.e1"></el-input>
        </el-form-item>
        <el-form-item prop="e1" label="地址">
          <el-input v-model="data.e2"></el-input>
        </el-form-item>
      </el-row>

      <!-- 随意穿插其他内容  -->
      <el-button style="margin-top:20px" @click="validate" type="primary">验证</el-button>
    </el-form>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      data: {
        e1: "",
        e2: "",
        list: [
          { d1: "", d2: "" },
          { d1: "", d2: "" },
          { d1: "", d2: "" },
        ],
      },
      inlineItems: [
        { prop: "a1", label: "姓名", required: true },
        { prop: "a2", label: "地址" },
      ],
      gridItems: [
        { prop: "b1", label: "姓名", required: true },
        { prop: "b2", label: "地址" },
        { prop: "b3", label: "介绍", type: "textarea", span: 24 },
      ],
      decItems: [
        { prop: "c1", label: "姓名", required: true },
        { prop: "c2", label: "地址" },
        { prop: "c3", label: "介绍", type: "textarea", span: 2 },
      ],
      tableItems: [
        { prop: "d1", label: "姓名", width: 150 },
        { prop: "d2", label: "姓名", required: true, width: 150 },
        { prop: "d3", label: "介绍",  minWidth: 100 },
      ],
    };
  },
  methods: {
    validate() {
      this.$refs.form.validate((is) => {
        if (is) {
          this.$message.success("成功");
        } else {
          this.$message.error("验证失败");
        }
      });
    },
  },
};
</script>

# 作为单组件使用

你甚至可以把 layout 组件作为单组件使用,但是这样的数据结构会稍显复杂,灵活性大幅降低。

点击查看代码
<template>
  <div class="demo border">
    <agel-form v-model="form"></agel-form>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      form: {
        layout: "grid",
        data: {
          name: "演示",
          tableditor: [{ name: "tableditor", intor: "" }],
          inline: { name: "inline" },
          descriptions: { name: "descriptions" },
        },
        items: [
          { prop: "name", label: "姓名", span: 12, required: true },
          {
            prop: "descriptions",
            label: "descriptions",
            component: "agel-form-descriptions",
            column: 1,
            items: [
              { prop: "name", label: "姓名", required: true },
              { prop: "region", label: "地址" },
            ],
          },
          {
            prop: "tableditor",
            label: "table",
            component: "agel-form-tableditor",
            items: [
              { prop: "name", label: "姓名", required: true },
              { prop: "region", label: "地址" },
              { prop: "intor", label: "介绍" },
            ],
            // 注意:使用函数插槽 prepend append 只能返回单列
            slots: {
              prepend: () => {
                return (
                  <el-table-column
                    type="selection"
                    label="多选"
                    key="selection"
                  ></el-table-column>
                );
              },
              append: () => {
                return (
                  <tableditor-menu-column
                    data={this.form.data.tableditor}
                    edit={false}
                    width={80}
                  ></tableditor-menu-column>
                );
              },
            },
          },
        ],
      },
    };
  },
};
</script>

# Layout

TIP

  • 每个布局组件都共有的基础属性,插槽,方法
  • 各布局组件额外属性的支持情况,请参考 Props keys
属性 类型 默认值 说明
items Object/Array [] 表单配置项
model-prop String - 关联到表单的 prop 名称,动态表单必填
itemExtendKeys Array - 包含在内的属性名不会被注入到组件中

item 配置项支持 component 组件的动态属性。

item 配置项支持 el-form-item 属性 (opens new window)

# Mehtod

属性 参数 说明
getItem prop:string 获取指定 item 对象
getRef prop:string 获取指定组件的 vue 实例

# Slot

属性 说明
prepend 表单头部追加内容
append 表单尾部追加内容
...... 表单项的 prop 具名插槽

# AgelFormGrid

属性 类型 默认值 说明
type String flex 继承自 el-row
responsive Boolean false 是否响应式布局
responsiveMethod Funciton - 自定义响应式规则
...... ...... ...... el-row 属性
...... ...... ...... el-col 属性 (opens new window)

item 配置项可额外支持 el-col 属性 (opens new window)

# Mehtod

属性 参数 说明
resize - 手动刷新 自适应

# AgelFormDescriptions

属性 类型 默认值 说明
border Boolean true border 样式
...... ...... ...... el-descriptions 属性 (opens new window)

item 配置项可额外支持 el-descriptions-item 属性 (opens new window)

# AgelFormTableditor

属性 类型 默认值 说明
border Boolean true border 样式
...... ...... ...... el-table 属性 (opens new window)

item 配置项可额外支持 el-table-column 属性 (opens new window);

# Mehtod

属性 参数 说明
validateRow (index,successCallback) 对列表某一行的表单进行验证

# TableditorMenuColumn

编辑菜单列,该组件用于搭配 tableditor 布局使用,点击保存时会验证当前行。

属性 类型 默认值 说明
data Array true 表格数据
add Boolean/Function(done,scopd) true 是否显示/ done(要新增的数据)
edit Boolean/Function(done,scopd) true 是否显示/ done(保存是否成功)
del Boolean/Function(done,scopd) true 是否显示/ done(删除是否成功)
...... ...... ...... el-table-column 属性 (opens new window)