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 相关文章推荐
jQuery 操作XML入门
Dec 25 Javascript
javascript web页面刷新的方法收集
Jul 02 Javascript
利用javascript/jquery对上传文件格式过滤的方法
Jul 25 Javascript
Jquery实现无刷新DropDownList联动实现代码
Mar 08 Javascript
JS中eval函数的使用示例
Jul 21 Javascript
javascript转换日期字符串为Date日期对象的方法
Feb 13 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
May 13 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
JS去除字符串中空格的方法
Feb 14 Javascript
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
vue实现键盘输入支付密码功能
Aug 18 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上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
PHP中的str_repeat函数在JavaScript中的实现
2013/09/16 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
JS typeof fn === 'function' &amp;&amp; fn()详解
2020/08/22 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
Python中内建函数的简单用法说明
2016/05/05 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python中类的属性和方法介绍
2018/11/27 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
大学生物业管理求职信
2013/10/24 职场文书
电子商务应届生求职信
2013/11/16 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
个人廉洁自律总结
2015/03/06 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python