Vue2 +Elementui 动态、批量 创建 form表单 & 表单校验

前言

特别是在一些常见的后管系统,会遇见 动态 创建/复制 表单,本次实例 以 Vue2 + Elementui 为例,输出一个Demo,效果如下图:

实例图

常见的form表单
新增后的效果如下:

在这里插入图片描述
如上图便是 我们要实现的效果,代码如下:

代码

1、Html

  <div class="page">
    <div class="home-title">
      功能添加
    </div>
    <div class="add-btn flex">
      <span class="add-btn__icon">+</span>
      <span class="add-btn__text" @click="handleAddForm">新增功能</span>
    </div>
    <el-form ref="form" :model="form" class="page-form" label-width="120px" style="width:650px;" label-position="left" :rules="rules">
      <div v-for="(item, index) in form.dynamicItem" :key="index" class="page-form__list">
        <el-form-item
          label="功能模块名称"
          :prop="'dynamicItem.' + index + '.a'"
          :rules="{required: true, message: '请输入该模块名称', trigger: 'blur'}"
        >
          <el-input v-model="item.a" placeholder="请输入该模块名称" clearable />
        </el-form-item>
        <el-form-item
          label="图片上传"
          :prop="'dynamicItem.' + index + '.b'"
          :rules="{required: false, message: '请上传图片', trigger: 'blur'}"
        >
        </el-form-item>
        <el-form-item
          label="文案标题"
          :prop="'dynamicItem.' + index + '.c'"
          :rules="{required: true, message: '请输入文案标题', trigger: 'blur'}"
        >
          <el-input v-model="item.c" placeholder="请输入文案标题" clearable />
        </el-form-item>
        <el-form-item
          label="文案内容"
          :prop="'dynamicItem.' + index + '.d'"
          :rules="{required: true, message: '请输入文案内容', trigger: 'blur'}"
        >
          <el-input type="textarea" :rows="4" v-model="item.d" placeholder="注意:字数请在100字以内" clearable />
        </el-form-item>
        <el-form-item v-if="form.dynamicItem.length > 1" style="position:absolute;right:-60px;top:0px;">
          <i class="el-icon-delete" @click="deleteItem(item, index)"></i>
        </el-form-item>
      </div>
      <el-form-item>
        <el-button type="primary" class="submit-btn" @click="submit">发布</el-button>
        <el-button type="primary" class="common-btn">预览</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

2、JS部分

export default {
  data() {
    return {
      form: {
        dynamicItem: [{
          a: '',
          b: '',
          c: '',
          d: ''
        }]
      }
    }
  },
  methods: {
    // 提交
    submit() {
      this.$refs['form'].validate(valid => {
        if (valid) {
          console.log(this.form)
        }
      })
    },
    // 新增
    handleAddForm() {
      this.form.dynamicItem.push({
        a: '',
        b: '',
        c: '',
        d: ''
      })
    },
    // 删除操作
    deleteItem(item, index) {
      this.form.dynamicItem.splice(index, 1)
    }
  }
}

css样式就不贴了,下面进行原理分析:

原理分析

我们需要把form表单每一项绑定的值组成一个对象,对象叠加组成了一个对象数组,循环对象数组每一项生成的一个form表单。当点击新增一项时,其实就是给form表单对象数组添加一个对象,删除则反之。

如有疑问,可留言,欢迎沟通~

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Vue 3 中使用 Ant Design Vue 的 Form 表单组件进行确认密码校验,你可以自定义校验规则来实现。下面是一个示例: ```vue <template> <a-form ref="form" :model="formData"> <a-form-item label="密码" name="password" rules="required"> <a-input type="password" v-model="formData.password" /> </a-form-item> <a-form-item label="确认密码" name="confirmPassword" rules="required,checkPassword"> <a-input type="password" v-model="formData.confirmPassword" /> </a-form-item> <a-form-item> <a-button type="primary" @click="submitForm">提交</a-button> </a-form-item> </a-form> </template> <script> import { ref } from 'vue'; import { Form, Input, Button, message } from 'ant-design-vue'; export default { components: { 'a-form': Form, 'a-form-item': Form.Item, 'a-input': Input, 'a-button': Button }, setup() { const formRef = ref(null); const formData = ref({ password: '', confirmPassword: '' }); const checkPassword = (_, value) => { if (value !== formData.password) { return Promise.reject(new Error('两次密码输入不一致')); } return Promise.resolve(); }; const submitForm = () => { formRef.value.validate((valid) => { if (valid) { // 验证通过,执行表单提交操作 console.log('表单验证通过'); // ... } else { console.log('表单验证失败'); } }); }; return { formRef, formData, checkPassword, submitForm }; } }; </script> ``` 在上述示例中,我们在确认密码字段的 `a-form-item` 组件上定义了一个名为 `checkPassword` 的校验规则。该规则使用了一个自定义校验函数,并在函数内部判断确认密码是否与密码字段的值相同。如果不相同,我们使用 `Promise.reject` 返回一个错误信息,表示校验失败;如果相同,我们使用 `Promise.resolve` 表示校验通过。 然后,我们将这个校验规则 `checkPassword` 应用到确认密码字段的 `rules` 属性中,通过逗号分隔多个规则。注意,我们还将 "required" 规则也应用到了确认密码字段上,以确保确认密码不能为空。 在 `submitForm` 方法中,我们使用 `formRef.value.validate` 方法来进行表单验证,当验证完成后执行回调函数。你可以在回调函数中处理验证通过和验证失败的情况。 希望以上信息对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值