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 相关文章推荐
javascript脚本编程解决考试分数统计问题
Oct 18 Javascript
利用javascript实现一些常用软件的下载导航
Aug 03 Javascript
可以用鼠标拖动的DIV实现思路及代码
Oct 21 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
JavaScript里实用的原生API汇总
May 14 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
微信小程序-消息提示框实例
Nov 24 Javascript
layui实现table加载的示例代码
Aug 14 Javascript
微信小程序手机号码验证功能的实例代码
Aug 28 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
Mar 28 Javascript
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
深入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之数组学习
2011/05/29 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
python利用sklearn包编写决策树源代码
2017/12/21 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
Django中提示消息messages的设置方式
2019/11/15 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
行政前台岗位职责
2013/12/04 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
党支部鉴定意见
2015/06/02 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
python用tkinter开发的扫雷游戏
2021/06/01 Python
详解Python中*args和**kwargs的使用
2022/04/07 Python