vue+element实现动态加载表单


Posted in Vue.js onDecember 13, 2020

本文实例为大家分享了vue+element实现动态加载表单的具体代码,供大家参考,具体内容如下

一、问卷动态加载表单

vue+element实现动态加载表单

//html
<el-form :model="quesPaper" status-icon label-width="100px" label-position="top" size="small" v-loading="paperLoading" >  
 <el-form-item
 v-for="n in paperForm.answerList"
 :label="n.questionRepository.question"
 :key="n.key"
 >
 <!-- 单选 -->
 <el-radio-group v-model="n.optionId" v-if="n.questionRepository.type === 1">
 <el-radio v-for="(i, idx) in n.questionOption" :label="i.id" :key="idx" class="mb5">{{ i.questionOption }}</el-radio>
 </el-radio-group>
 <!-- 多选 -->
 <el-checkbox-group v-model="n.optionId" v-if="n.questionRepository.type === 2">
 <el-checkbox v-for="(i, idx) in n.questionOption" :label="i.id" :key="idx">{{ i.questionOption }}</el-checkbox>
 </el-checkbox-group>
 <!-- 填空 -->
 <el-input type="textarea" style="width: 600px" class="fl" v-model="n.answer" v-if="n.questionRepository.type === 3" :rows="4" placeholder="请输入内容" ></el-input>
 </el-form-item>


 <el-row class="mt20" type="flex" justify="start">
 <el-col :span="5">
 <el-button type="primary" size="small" @click.stop="saveStageAnswer">保存问卷</el-button>
 </el-col>
 </el-row>
</el-form>

//data数据
paperForm: { // 问卷表单
 answerList:[{
 questionRepository:'',
 questionOption:[],

 questionId: '',
 optionId:'',
 answer: ''
 }]
 },
//接口
getPaperByDrugStatus(drugStatus, id){ // 根据用药状态获取问卷
 this.paperLoading = true
 this.$axios.get(this.$api + 'xxx/xxx?paperId='+this.selectStage.paperId + '&drugStatus=' + drugStatus).then(res => {
 if(res.data.code === 200){
 let answerArr = []
 let questionArr = []
 res.data.data.questionToList.map((item)=>{
 item.optionList.map((n)=>{
  questionArr.push({
  id:n.id,
  questionOption:n.questionOption
  })
 })
 answerArr.push({
  questionOption:questionArr,
  questionRepository:item.questionRepository,

  questionId:item.questionRepository.id,
  optionId:item.questionRepository.type === 2?[]:'',
  answer: ''
 })
 })
 console.log(answerArr)
 this.paperForm = { // 问卷表单
 answerList:answerArr
 }
 setTimeout(() => {
 this.paperLoading = false
 }, 300)
 }
 })
},

二、批量数据动态加载表单

vue+element实现动态加载表单

特点:

1.每一行的输入框,根据后台返回值,动态生成,数量可增可减。
2.行数根据自己设置的值 5 ,自动循环生成。
3.验证需要:prop和:rules,如果不验证,就删了

<template>
<!-- 录入数据 -->
 <div class="DialyInputDetail" >
 <div class="fw fz16 color6 mb20 mt10">批量录入<span class="colorRed">{{tabHeader.monthStr}}</span>数据</div>
 <el-form status-icon label-width="100px" :model="newForm" ref='newForm' label-position="top" size="small"> 
 <table border="1" class="fw fz14 color6 table">
 <tr>
  <td rowspan='2'>患者请用姓名<br/>或病历号模糊筛选</td>
  <td :colspan="tabHeader.firstTables.length" class="tc colorRed lh40">以下信息每1个月登记一次</td>
  <td :colspan="tabHeader.secondTables.length" class="tc colorRed lh40">以下信息每3个月登记一次</td>
  <td :colspan="tabHeader.thirdTables.length" class="tc colorRed lh40">以下信息每6个月登记一次</td>
 </tr>
 <tr class="lh40">
  <td v-for="item in tabHeader.firstTables" :key="item.name" class="tc">{{item.name}}</td>
  <td v-for="n in tabHeader.secondTables" :key="n.name" class="tc">{{n.name}}</td>
  <td v-for="z in tabHeader.thirdTables" :key="z.nam" class="tc">{{z.name}}</td>
 </tr>
 
 <tr v-for="(w,index) in newForm.colList" :key="index+'a'" >
  <td> 
  <el-form-item
  :prop="'colList.'+index+'.patientId'"
  >
  <!--- :rules="{required: true, message: '不能为空', trigger: 'blur'}"-->
  <el-select v-model="w.patientId" size="small" style="width: 100px" filterable clearable>
  <el-option
   v-for="(ite, idx) in patientArr"
   :label="ite.patient" 
   :key="idx"
   :value="ite.id">
  </el-option>
  </el-select>
  </el-form-item>
  </td>
  <td class="tc" v-for="(n,j) in w.itemDataList" :key="j">
  <el-form-item
  :prop="'colList.'+index+'.itemDataList.' + j + '.itemValue'"
  >
  <!-- :rules="{required: true, message: '不能为空', trigger: 'blur'}"-->
  <el-select v-model="n.itemValue" size="small" style="width: 100px" v-if="n.type == 2" filterable clearable>
  <el-option
   v-for="(i, idx) in n.opts"
   :label="i" 
   :key="idx"
   :value="i">
  </el-option>
  </el-select>
  <el-input style="width: 100px" size="small" v-model="n.itemValue" v-if="n.type == 1" ></el-input>
  </el-form-item>
  </td>
 </tr>
 </table>  
 <el-row class="mt20" type="flex" justify="start">
 <el-col :span="5">
  <el-button type="primary" size="small" @click="submitNew('newForm')">提交数据</el-button>
 </el-col>
 </el-row>
 </el-form>
 </div>
</template>

<script>
import Vue from 'vue'

export default {
 name: 'DialyInputDetail',
 props:['dialysisId','dialysisCenter'],
 data() {
 return {
 tabHeader:{
 firstTables:[],
 secondTables:[],
 thirdTables:[],
 colNub:[]
 },
 dialyDetail:{},
 newForm:{
 id:'',
 colList:[
  // {
  // patientId:123,  //患者id
  // createUserId:123,  //当前用户id
  // createUserName:"管理员" ,
  // itemDataList:[{
  // itemId:'',
  // itemValue:'',
  // type:1
  // }] 
  // }
 ],
 },
 patientArr:[],
 }
 },
 created () { 
 this.getMedRdTables(this.dialysisId)
 this.getPatient(this.dialysisId)
 },
 methods: {
 getMedRdTables(id){//获取录入tab
 this.$axios.get(this.$my.api + '/bms/input/getMedRdTables?dialysisId='+id).then(res => { 
 if(res.data&&res.data.code === 200){ 
  this.tabHeader = res.data.data
  this.tabHeader.colNub = [...res.data.data.firstTables,...res.data.data.secondTables,...res.data.data.thirdTables] 
  this.newForm.colList = []
  for(let i=0;i<5;i++){//要push的对象,必须写在循环体内
  let arr = [] 
  let obj = {
  patientId:'',
  dialysisId:res.data.data.auth.dialysisId,  //透析中心id
  dialysisCenter:res.data.data.auth.dialysisCenter, //透析中心名称
  //patientId:'',  //患者id
  //patient:'', //患者名称
  inputAuthId:res.data.data.auth.id,  //透析中心权限id
  year:res.data.data.auth.inputYear,  //录入年份
  month:res.data.data.auth.inputMonth, 
  createUserId:JSON.parse(localStorage.getItem('userInfo')).session.id,
  createUserName:JSON.parse(localStorage.getItem('userInfo')).session.name,
  }  
  this.tabHeader.colNub.map(n=>{
  arr.push({itemId:n.id ,opts:n.opts ,itemValue:'',type:n.type})
  })
  obj.itemDataList = arr
  this.newForm.colList.push(obj)
  }
 }else{
  this.$message({
  message: res.data.message,
  type: 'error',
  duration: 1500
  })
  return false
 } 
 }).catch(function (error) {})
 },
 getDialyDetail(id){//获取透析中心详情
 this.$axios.get(this.$my.api + '/bms/input/getDialyDetail?id='+id).then(res => { 
 if(res.data&&res.data.code === 200){ 
  this.dialyDetail = res.data.data
 }else{
  this.$message({
  message: res.data.message,
  type: 'error',
  duration: 1500
  })
  return false
 } 
 }).catch(function (error) {})
 },
 getPatient(id){
 this.$axios.get(this.$my.api + '/bms/input/getAllPatList?dialysisId='+id).then(res => { 
 if(res.data&&res.data.code === 200){ 
  this.patientArr = res.data.data
 }else{
  this.$message({
  message: res.data.message,
  type: 'error',
  duration: 1500
  })
  return false
 } 
 }).catch(function (error) {})
 },
 submitNew(formName){ //新增-原本所有都是必填项,后改为name和hb值必填
 this.$refs[formName].validate((valid) => {
 if (valid) {
 let ok = false
 this.newForm.colList.map((item)=>{
  if(item.patientId){
  let name = item.itemDataList.find((n)=>n.itemId == 33)
  if(name&&name.itemValue=='') ok = true
  }
 })
 if(this.newForm.colList.every((item)=>item.patientId == '')){
  this.$message({
  message: '至少填写一个患者',
  type: 'error',
  duration: 1500
  })
  return false
 }
 if(ok){
  this.$message({
  message: '透析前舒张压(mmHg)不能为空',
  type: 'error',
  duration: 1500
  })
  return false
 }
 this.$axios.post(this.$my.api + '/bms/input/bathSaveRecord', this.newForm.colList).then(res => { 
  if(res.data&&res.data.code === 200){ 
  this.$message({
   message: res.data.message,
   type: 'success',
   duration: 1500
  })
  this.$refs[formName].resetFields();
  }else{
  this.$message({
   message: res.data.message,
   type: 'error',
   duration: 1500
  })
  } 
 }).catch( error =>{})
 } else {
 console.log('error submit!!');
 return false;
 }
 });
 }
 },
}
</script>

<style scoped>
.table{
 border-color: #aaa;
 width: 1000px;
 overflow: auto;
}
.table .el-form-item--small.el-form-item{
 margin: 8px;
}
</style>

部分必选:

data(){
 return {
 formList:[{
 patient:'',
 caseNumber:'',
 year:'',
 sex:'',
 dialysisAge:'',
 primaryDisease:'',
 diagnosis:'',
 creatinine:'',
 gfr:'',
 weekTreatTimes:'',
 weekDialysisHours:''
 },{
 patient:'',
 caseNumber:'',
 year:'',
 sex:'',
 dialysisAge:'',
 primaryDisease:'',
 diagnosis:'',
 creatinine:'',
 gfr:'',
 weekTreatTimes:'',
 weekDialysisHours:''
 },{
 patient:'',
 caseNumber:'',
 year:'',
 sex:'',
 dialysisAge:'',
 primaryDisease:'',
 diagnosis:'',
 creatinine:'',
 gfr:'',
 weekTreatTimes:'',
 weekDialysisHours:''
 }]
 },
 methods:{
 submitData(){
 let param={
 dialysisId:this.$route.query.id,
 dialysisCenter:this.$route.query.name,
 createUserName:JSON.parse(localStorage.getItem('userInfo')).session.name,
 createUserId:JSON.parse(localStorage.getItem('userInfo')).session.id,
 patientList:nweArr
 }
 // 部分必选 start
 let ok = false
 // 需要必选的值
 let rules = [{name:'patient',msg:'姓名'},{name:'caseNumber',msg:'身份证'},{name:'year',msg:'年龄'},{name:'sex',msg:'性别'}]
  this.formList.map((item)=>{
  //每一行,是否有值
  let hangNoVal = Object.keys(item).every(n=>item[n] == '')
  if(!hangNoVal){ //任意一个有值
  for(let i of rules){ 
  if(item[i.name] == ''){//必填项是否有值
   this.$message({
   message: i.msg+'不能为空!',
   type: 'error',
   duration: 1500
   })
   break
  }
  }
  }else{
  ok = true
  }
  })
  if(ok){
  this.$message({
  message: '请填写,再提交',
  type: 'error',
  duration: 1500
  })
  return false
  }
 // 部分必选 end
 this.$axios.post(this.$my.api + '/bms/input/bathSavePat',param).then(res => { 
 if(res.data&&res.data.code === 200){ 
 //ok
 } 
 }).catch(function (error) {})
 },
 }
}

//情况二:有输入,才必填
// 部分必选 start
let ok = []
let no = ''
 // 需要必选的值
 let rules = [{name:'patient',msg:'姓名'},{name:'caseNumber',msg:'身份证'},{name:'year',msg:'年龄'},{name:'sex',msg:'性别'}]
 this.formList.map((item)=>{
 //每一行,是否有值
 let hangNoVal = Object.keys(item).every(n=>item[n] == '')
 if(!hangNoVal){ //任意一个有值
  ok.push(false)
  for(let i of rules){ 
  if(item[i.name] == ''){//必填项是否有值
  no = true
  this.$message({
   message: i.msg+'不能为空!',
   type: 'error',
   duration: 1500
  })
  break
  }
  }
 }else{
  ok.push(true)
 }
 })
 if(ok.every(n=>n == true)){
 this.$message({
  message: '请填写,再提交',
  type: 'error',
  duration: 1500
 })
 return false
 }
 if(no){
 return false
 }
 // 部分必选 end

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

Vue.js 相关文章推荐
如何实现vue的tree组件
Dec 03 Vue.js
vue el-upload上传文件的示例代码
Dec 21 Vue.js
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
Vue SPA 首屏优化方案
Feb 26 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
vue自定义右键菜单之全局实现
Apr 09 Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 #Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 #Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 #Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 #Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 #Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 #Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 #Vue.js
You might like
adodb与adodb_lite之比较
2006/12/31 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
php PDO异常处理详解
2016/11/20 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
django 自定义用户user模型的三种方法
2014/11/18 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
基于Python中的yield表达式介绍
2019/11/19 Python
PageFactory设计模式基于python实现
2020/04/14 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
Python新手学习装饰器
2020/06/04 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
财务检查整改报告
2014/11/06 职场文书
大学生个人学年总结
2015/02/15 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
带你了解Java中的ForkJoin
2022/04/28 Java/Android