详细分析 Vue2 中的 a-form-item基本知识(附Demo)

目录

  • 前言
  • [1. 基本知识](#1. 基本知识)
  • [2. Demo](#2. Demo)
  • [3. 实战](#3. 实战)

前言

Java基本知识:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

奔着从实战中出发剖析基本知识

1. 基本知识

a-form-item 是 Ant Design Vue 表单组件 中用于:

  • 给控件加 label(标签)

  • 设置 label 和表单控件的布局(labelCol、wrapperCol)

  • 处理验证状态(success/error/warning 等)

  • 配合 v-decorator 来实现 表单数据管理 + 校验

常用属性(最重要)

属性 说明
label 表单项左侧标题
labelCol label 的布局(栅格宽度)
wrapperCol 控件区域布局
help 自定义帮助信息
validateStatus 验证状态:success / warning / error / validating
required 是否标记为必填(只显示红 *,不代表校验规则)
extra 额外说明文字

简易的例子

html 复制代码
<a-form-item
  label="用户名"
  :labelCol="{ span: 5 }"
  :wrapperCol="{ span: 16 }"
  validateStatus="error"
  help="用户名不能为空"
>

2. Demo

常用的Demo写法如下

输入用户名、手机号

校验必填 + 正则

提交收集数据

自动显示错误提示

html 复制代码
<template>
  <a-form :form="form" @submit.prevent="handleSubmit">

    <!-- 用户名 -->
    <a-form-item
      label="用户名"
      :labelCol="labelCol"
      :wrapperCol="wrapperCol"
    >
      <a-input
        placeholder="请输入用户名"
        v-decorator="[
          'username',
          { 
            rules: [
              { required: true, message: '用户名不能为空' },
              { min: 3, message: '至少 3 个字符' }
            ]
          }
        ]"
      />
    </a-form-item>

    <!-- 手机号 -->
    <a-form-item
      label="手机号"
      :labelCol="labelCol"
      :wrapperCol="wrapperCol"
    >
      <a-input
        placeholder="请输入手机号"
        v-decorator="[
          'mobile',
          { 
            rules: [
              { required: true, message: '请输入手机号' },
              { pattern: /^1\d{10}$/, message: '手机号格式不正确' }
            ]
          }
        ]"
      />
    </a-form-item>

    <!-- 提交按钮 -->
    <a-form-item :wrapperCol="{ span: 16, offset: 5 }">
      <a-button type="primary" html-type="submit" :loading="loading">
        提交
      </a-button>
    </a-form-item>

  </a-form>
</template>

<script>
export default {
  name: "UserFormDemo",

  beforeCreate() {
    this.form = this.$form.createForm(this);  // 必须创建 form
  },

  data() {
    return {
      loading: false,

      // label 和控件 的布局
      labelCol: { span: 5 },
      wrapperCol: { span: 16 },
    };
  },

  methods: {
    handleSubmit() {
      this.form.validateFields((err, values) => {
        if (!err) {
          console.log("提交的数据:", values);
          this.$message.success("提交成功!");
        }
      });
    }
  }
};
</script>

<style scoped>
</style>

🧩 结构分析(核心写法)

1️⃣ 绑定 form

javascript 复制代码
beforeCreate() {
  this.form = this.$form.createForm(this);
}

👉 这是 AntD Vue2 的黑科技,必须写。

2️⃣ 使用表单布局(labelCol & wrapperCol)

javascript 复制代码
labelCol: { span: 5 },
wrapperCol: { span: 16 },

让 label 占 5 列,控件占 16 列。

3️⃣ v-decorator 管理字段 + 校验规则

标准语法:v-decorator="['字段名', 配置规则]"

示例:

javascript 复制代码
v-decorator="[
  'username',
  {
    rules: [
      { required: true, message: '不能为空' }
    ]
  }
]"

4️⃣ 提交表单统一校验

javascript 复制代码
this.form.validateFields((err, values) => {
  if (!err) {
    console.log(values)
  }
})

⚡ 不需要手写错误提示,a-form-item 会自动显示

3. 实战

项目中实战的代码模块经典结构如下:

html 复制代码
<a-form-item
  label="用户姓名"
  :labelCol="labelCol"
  :wrapperCol="wrapperCol"
>
  <a-input
    placeholder="请输入用户姓名"
    v-decorator.trim="['username', validatorRules.username]"
  />
</a-form-item>

Demo 使用的是:

html 复制代码
labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
},
wrapperCol: {
  xs: { span: 24 },
  sm: { span: 16 }
}
  • 在小屏:label 和控件都占 24 列(换行)

  • 在大屏:label 占 5,内容占 16(共 24 栅格)

👉 这是 AntD 的 响应式栅格布局方式

validatorRules.username(校验规则示例)

代码里面是:

html 复制代码
username: {
  rules: [
    { required: true, message: '请输入用户名称!' }
  ]
}

常见校验如下:

规则 示例
required { required: true }
min/max 长度 { min: 3, max: 20 }
正则 pattern { pattern: /^[A-Za-z]+$/ }
自定义校验 { validator: this.myValidator }
相关推荐
unique_perfect8 小时前
vue2与springboot实现deepseek打印机聊天
spring boot·websocket·ai·vue2·deepseek
weixin_445476682 个月前
Vue 项目全局水印功能完整实现指南
vue·vue2·1024程序员节
duansamve2 个月前
Vue3和vue2的Diff算法有何差异?
vue·vue3·vue2·diff
昔冰_G2 个月前
Vue内置组件KeepAlive——缓存组件实例
vue.js·缓存·vue3·vue2·keep-alive·vue组件缓存·vue内置组件
胡西风_foxww4 个月前
Vue2 项目实现 Gzip 压缩全攻略:从配置到部署避坑指南
nginx·部署·vue2·配置·gzip·压缩·攻略
汪叽家的兔子羡5 个月前
vue模块化导入
前端·javascript·vue.js·typescript·vue3·vue2·vite
胡斌附体6 个月前
使用模板创建uniapp提示未关联uniCloud问题
uni-app·vue2·配置问题·unistatistics·manfest.json
imkaifan6 个月前
父组件prop传向子组件的值,被子组件直接v-model绑定 功能不生效
vue2·vue2迁移vue3
有梦想的攻城狮6 个月前
从0开始学vue:vue3和vue2的关系
前端·javascript·vue.js·vue3·vue2