vue element动态渲染、移除表单并添加验证的实现


Posted in Javascript onJanuary 16, 2019

又接到新需求了吧~~

背景

在一个大表单里,有可能会出现这种需求,用户可以自己操作动态添加、移除表单,更加个性化的效果。

常见于填写个人信息、附加内容的表单

例如:

“工作经历”可以用户自己点击继续添加按钮,在原有的表单后面 append 多一个表单,不需要就点击右上方 X 按钮移除

问题

在实现之前,提出几个问题

  • vue 怎么动态渲染或移除表单上去
  • v-model 怎么绑定动态添加表单的 value 值
  • 动态新增的表单如何验证
  • 动态表单怎么填写对应的 prop
  • ...

好吧,我当时也思考了一会,最后选择数组方式,动态渲染

代码实现讲解

利用数组,v-for 循环方式,可以完美实现动态渲染和移除,因为操作的只有对象数组而已

export default {
 name: 'vouchersDetail',
 data() {
  return {
   form: {
    regionName: '',
    regionCode: '',
  // 动态添加的对象数组
    azList: [
     {
      azName: '',
      logicCode: '',
      physicCode: ''
     }
    ]
   }
  }
 },
 computed: {
  // 至少保留一个动态表单的开关
  isShowCloseBtn() {
   return this.form['azList'].length > 1
  }
 },
 methods: {
  addItem() {
   // 点击添加表单的按钮,只需要将表单绑定的 value 作为对象 push 到对象数组
   this.form['azList'].push({
    azName: '',
    logicCode: '',
    physicCode: '',
    weight: ''
   })
  },
  deleteItem(index) {
   // 点击移除表单的按钮,根据点击的当前 index 移除对象数组的元素
   this.form['azList'].splice(index, 1)
  },
  goBack() {
   window.history.back(-1)
  }
 }
}

请格外注意动态添加表单的 rule 和 prop

每个动态添加的表单都要加上 rule

prop 需要根据对象数组下标绑定设置对应的 value(:prop="'azList' + index + '.azName'")

那么对应的 html 形式为

<div class="section-form" v-for="(item, index) in form.azList" :key="index"> 
 <span v-if="isShowCloseBtn" class="close" @click="deleteItem(index)">
  <i class="el-icon-close"></i>
 </span> 
 <el-form-item label="可用区名称:"
  :rules="[{ required: true, message: '可用区名称不能为空' }]"
  :prop="'azList[' + index + '].azName'"
  label-width="150px"> 
  <el-input placeholder="请输入可用区名称" v-model="item.azName" :maxlength="30"></el-input> 
 </el-form-item> 
 <el-form-item label="逻辑可用区编码:"
  :rules="[{ required: true, message: '逻辑可用区编码不能为空' }]"
  label-width="150px"
  :prop="'azList[' + index + '].logicCode'"> 
  <el-input placeholder="请输入唯一ID" v-model="item.logicCode" :maxlength="30"></el-input> 
 </el-form-item> 
 <el-form-item label="物理可用区编码:"
  :rules="[{ required: true, message: '物理可用区编码不能为空' }]"
  label-width="150px"
  :prop="'azList[' + index + '].physicCode'"> 
  <el-input placeholder="请输入唯一ID" v-model="item.physicCode" :maxlength="30"></el-input> 
 </el-form-item>
</div>

写在后面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js+FSO遍历文件夹下文件并显示
Mar 07 Javascript
jquery获取子节点和父节点的示例代码
Sep 10 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
May 20 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
浅谈JavaScript中null和undefined
Jul 09 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
May 28 Javascript
React Router基础使用
Jan 17 Javascript
前端开发之CSS原理详解
Mar 11 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
详解Vue中的scoped及穿透方法
Apr 18 Javascript
微信小程序实现的一键复制功能示例
Apr 24 Javascript
深入koa-bodyparser原理解析
Jan 16 #Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 #jQuery
详解微信小程序之scroll-view的flex布局问题
Jan 16 #Javascript
vue开发环境配置跨域的方法步骤
Jan 16 #Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
Jan 16 #Javascript
在Create React App中启用Sass和Less的方法示例
Jan 16 #Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 #Javascript
You might like
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
Python实时获取cmd的输出
2015/12/13 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
Tensorflow 多线程设置方式
2020/02/06 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
使用Pycharm分段执行代码
2020/04/15 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
电气专业应届生求职信
2013/11/01 职场文书
校运会入场式解说词
2014/02/10 职场文书
毕业晚会主持词
2014/03/24 职场文书
信用卡工资证明格式
2014/09/13 职场文书