vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作


Posted in Javascript onAugust 03, 2020

在项目中做联系人的添加和编辑功能,点击父级页面的添加和编辑按钮,用的是同一个表单弹窗,数据添加和编辑用同一个弹窗,没有在弹窗使用v-if,性能不是很好,弹窗中有表单,在编辑弹窗表单数据之后关闭弹窗,然后点击添加的时候,弹窗里的表单数据还是之前编辑的数据,无法做到清空表单数据,接下来是解决方法了,嘿嘿

首先是不管是添加还是编辑,都需要将子组件需要的对象属性一一写出来,传给子组件,

然后是主要用到了el-form表单有一个清空重置表单数据的事件方法resetField(),在子组件表单弹窗打开的时候清空一下,在关闭子组件表单弹窗的时候还需要调用resetField()去重置表单数据。这样编辑数据之后再次打开添加数据,页面不会有之前的数据存在,也不会出现验证信息在页面上。

vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作

1. 在父级页面调用子级弹框表单组件(AddEdit.vue)

<!-- form是子组件的form表单数据,meg是子组件弹窗的标题(添加或者编辑) -->
 <!-- <add-edit :msg.sync="msg" v-if='msg' :form='form'></add-edit> -->
 <!-- 没有使用v-if 是因为频繁点击编辑和新增的话,性能方面不是很好-->
<template>
 <el-button @click='addClick'>添加</el-button>
 <el-button @click='editClick(scope.row)'>编辑</el-button>
 <!-- 子组件弹窗 -->
 <add-edit :msg.sync="msg" :form='formData'></add-edit>
</template>
<script>
export default {
 data() {
 return {
  formData: {}
 }
 },
 
 methods: {
 addClick() {
 //需要将子组件需要的对象属性传过去,这一步必须得有,这样在子组件才可以清空表单
  this.formData = {
  name: '',
  email: '',
  phone: ''
  }
  this.msg = '添加'
 },
 
 editClick(row) {
  this.formData = row;
  this.msg = '编辑'
 }
 }
}
</script>

2. 点击父级页面的编辑按钮,将人员信息传递给AddEdit.vue

<template>
 <el-dialog :visible.sync="isShow" width="500px" class="edit-contact" :before-close="closeDialog">
  <span slot="title">{{msg}}联系人</span>
  <el-form :model="form" ref="ruleForm" label-width="100px" :rules="rules" size="small">
   <el-form-item :label="it.label" :prop="it.prop" v-for="it in formLabel" :key="it.prop">
    <el-input v-model="form[it.prop]" :placeholder="`请输入${it.label}`"></el-input>
   </el-form-item>
  </el-form>
  <div class="base-btn-action">
   <el-button size="small" type="primary" @click="saveContact">{{form.id?'编辑':'添加'}}</el-button>
   <el-button size="small" @click="closeDialog">取 消</el-button>
  </div>
 </el-dialog>
</template>
<script>
export default {
 props: {
  msg: {
   //“添加”或者“编辑”
   type: String,
   default: ""
  },
  form: {
  //接收父组件传过来得对象数据
   type: Object,
   default: () => {}
  }
 },
 data() {
  return {
   formLabel: [
    { label: "姓名", prop: "name" },
    { label: "邮箱", prop: "email" },
    { label: "联系方式", prop: "phone" }
   ],
   rules: {
    name: [{ required: true, message: "请输入姓名", trigger: "change" }],
    email: [
     { required: true, message: "请输入邮箱", trigger: "change" },
     { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur"] }
    ],
    phone: [
     { required: true, message: "请输入手机号", trigger: "change" }
    ]
   }
  };
 },
 computed: {
 //通过props的数据msg的值是否为空来判断弹框显示与否
  isShow() {
   return this.msg === "" ? false : true;
  }
 },
 watch: {
 //监听子组件弹窗是否打开
  msg(n) {
  //子组件打开得情况
    if (n !== '') {
     if (!this.$refs.ruleForm) {
     //初次打开子组件弹窗的时候,form表单dom元素还没加载成功,需要异步获取
      this.$nextTick(() => {
       this.$refs.ruleForm.resetFields() // 去除验证
      })
     } else {
     //再次打开子组件弹窗,子组件弹窗的form表单dom元素已经加载好了,不需要异步获取
      this.$refs.ruleForm.resetFields() // 去除验证
     }
    }
   },
 },
 methods: {
  closeDialog() {
   this.$emit("update:msg", "");
   setTimeout(() => {
   //关闭弹窗的时候表单也重置为初始值并移除校验结果
    this.$refs.ruleForm.resetFields();
   }, 200);
  }
 }
};
</script>

好了,问题解决了,在此记录一下,以后可以翻回来再看看!

以上这篇vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery属性过滤选择器使用示例
Jun 18 Javascript
自己实现ajax封装示例分享
Apr 01 Javascript
jQuery中siblings()方法用法实例
Jan 08 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
AngularJS控制器详解及示例代码
Aug 16 Javascript
深入探讨Vue.js组件和组件通信
Sep 12 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
JS利用cookies设置每隔24小时弹出框
Apr 20 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
Aug 29 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
JS实现判断有效的数独算法示例
Feb 25 Javascript
使用TS来编写express服务器的方法步骤
Oct 29 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
Aug 03 #Javascript
VUE使用axios调用后台API接口的方法
Aug 03 #Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 03 #Javascript
js数组中去除重复值的几种方法
Aug 03 #Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
Aug 03 #Javascript
javascript运行机制之执行顺序理解
Aug 03 #Javascript
解决vue+elementui项目打包后样式变化问题
Aug 03 #Javascript
You might like
PHP memcache扩展的三种安装方法
2009/04/26 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python切换hosts文件代码示例
2013/12/31 Python
简述Python中的进程、线程、协程
2016/03/18 Python
Python数据类型详解(二)列表
2016/05/08 Python
python3 shelve模块的详解
2017/07/08 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python类的继承用法示例
2019/01/31 Python
python求绝对值的三种方法小结
2019/12/04 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
详解Python 中的容器 collections
2020/08/17 Python
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
新闻学专业应届生求职信
2013/11/08 职场文书
人事专员工作职责
2014/02/22 职场文书
教学改革实施方案
2014/03/31 职场文书
就业协议书样本
2014/08/20 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
任命书怎么写
2015/03/02 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
运动会5000米加油稿
2015/07/21 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
小学四年级作文之写景
2019/08/23 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL