背景

在做管理台项目时,我们会经常使用到表单+表格+弹窗表单的组合,以完成对数据的增、删、查、改

  • 在vue2+elementui项目中,使用弹窗dialog+表单form,实现对数据的添加和修改。
  • 每次关闭弹窗时,使用resetFields方法对表单进行重置。
  • 下一次打开弹窗时,
    • 如果是添加数据,那么会呈现空的表单。
    • 如果是修改数据,那么表单上已预填好了数据。

很多小伙伴可能会遇到表单重置的初始值问题,如图。

问题具体描述为:每次关闭弹窗时,表单不是重置为我们设置的空数据,而是重置为在该页面上第一次打开弹窗时表单的数据

这意味着,如果我们进入页面后第一次打开的是修改弹窗,那么以后每次表单重置的数据都是最开始打开的那个修改弹窗表单的初始数据

原因

让我们看下代码:

<template>
<div>
<!-- 添加 -->
<el-button @click="handleAdd">添加</el-button> <!-- 表格 -->
<el-table :data="tableData" style="width: 800px">
<el-table-column prop="id" label="id" width="180" align="center" />
<el-table-column prop="name" label="名称" width="180" align="center" />
<el-table-column label="操作" align="center">
<template v-slot="{ row }">
<el-button @click="handleEdit(row)">修改</el-button>
</template>
</el-table-column>
</el-table> <!-- 弹窗 -->
<el-dialog title="添加/修改" :visible.sync="dialogVisible" width="30%" :before-close="handleClose" center>
<template>
<div>
<el-form ref="form" :model="formData">
<el-form-item prop="name" label="名称">
<el-input v-model="formData.name"></el-input>
</el-form-item>
<el-form-item prop="id" label="id">
<el-input v-model="formData.id"></el-input>
</el-form-item>
</el-form>
</div>
</template>
<template #footer>
<el-button type="primary">确定</el-button>
<el-button type="info">取消</el-button>
</template>
</el-dialog>
</div>
</template> <script>
export default {
name: 'formInitial',
data() {
return {
tableData: [
{ id: 1, name: '王小虎' },
{ id: 2, name: '刘小白' },
{ id: 3, name: '张晓来' },
],
formData: {
name: '',
id: '',
},
dialogVisible: false,
};
},
methods: {
// 添加
handleAdd() {
this.dialogVisible = true;
},
// 编辑 !!! 问题所在 !!!
handleEdit(row) {
// 给表单赋初值
this.formData.name = row.name;
this.formData.id = row.id;
// 打开弹窗
this.dialogVisible = true;
},
// 弹窗关闭
handleClose() {
// 初始数据
this.$refs.form.resetFields();
// 关闭弹窗
this.dialogVisible = false;
}
},
};
</script>

这里我们重点关注handleEdit() 这个方法。

表面上看并没有什么问题,每次点击修改,打开弹窗前,表单赋初值。

这里就不跟大伙儿卖关子了,原因:

  • 一开始弹窗隐藏时,弹窗样式加上了display: none 属性。
  • display: none 属性的作用:将元素从DOM结构中完全移除。
  • 而表单是放在弹窗里的,意味着表单一开始不会出现在页面结构中,此时data 中的默认数据formData 并没有作用上表单。
  • 当点击修改时,触发handleEdit() 方法,修改了formData 。此时弹窗打开,新的formData 作用上表单,并且表单将新的formData当作了初始数据

解决

解决思路很简单,就是想办法让表单吃上原始的formData

原来是先赋数据,再打开弹窗。那么现在改为先打开弹窗,再赋数据。

只需要修改handleEdit()方法:

// 编辑
handleEdit(row) {
// 打开弹窗
this.dialogVisible = true;
// 等到下次DOM渲染完成,即弹窗完全显示后执行
this.$nextTick(() => {
// 给表单赋初值
this.formData.name = row.name;
this.formData.id = row.id;
});
},

这里用到this.$nextTick() ,是为了保证赋值是发生在弹窗打开后,所以弹窗打开的那一刻,表单使用的还是最初data中的formData ,并将其作为表单初始值。

elmentui表单重置初始值问题与解决方法的更多相关文章

  1. 获取表单的初始值,模拟placeholder属性

    input和textarea有一个默认属性defaultValue,即初始值. 即使在页面操作修改了input和textarea的内容,获取到的defaultValue依然是初始值.可通过该值模拟pl ...

  2. form表单提交后结果乱码的解决方法

    1.产生乱码原因:表单提交使用的method="get",get方式数据都是通过地址栏传输,数据会以iso-8859-1方式传输,因此产生乱码 2.概念:URI: Uniform ...

  3. ionic获取表单input的值的两种方法

    1.参数传递法 直接在input处使用 #定义参数的name值,注意在ts中参数的类型 html页面: <ion-input type="text" placeholder= ...

  4. JSP表单提交出现中文乱码的解决方法

    1)post方式 在servlet的doGet( )  doPost( )  中增加以下代码: response.setContentType("text/html;charset=utf- ...

  5. vue + elementui表单重置 resetFields问题(无法重置表单)

    问题: elementui在重置表单时,无法使用this.$refs['formRefVal'].resetFields()清空表单数据; elementui 设置rules后没有效果 解决方法: 1 ...

  6. 表单重置reset

    最近一直在做各种页面的“增删改查”,只是在做新增功能的时候,自己一直在使用 reset来清空form表单,原以为这样子的清空方法是万无一失的,可惜最终还是在进行“修改”操作完了之后再“新增”的时候,就 ...

  7. form表单重置、清空方法记录

    myform 是form的id属性值 1.调用reset()方法 function fomrReset() { document.getElementById("myform"). ...

  8. html 表单 dom 注意跟表单的name值一致

    html 表单 dom 注意跟表单的name值一致 <script type="text/javascript"> function checkForm() { var ...

  9. form表单元素的值序列化成对象

    /** * 将form表单元素的值序列化成对象 * param: form jquery form对象 */ var serializeObject = function(form) { var o ...

  10. 将form表单元素的值序列化成对象

    /**jQuery * 将form表单元素的值序列化成对象 * @returns object */ var serializeObject = function(form) { var o = {} ...

随机推荐

  1. Kubernetes(k8s)包管理工具Helm:Helm包管理

    目录 一.系统环境 二.前言 三.包管理工具Helm简介 四.安装部署helm 五.配置helm以及helm常用命令 六.使用helm安装应用 七.搭建helm私有仓库 八.总结 一.系统环境 本文主 ...

  2. 程序包xx不存在解决方案:java: 程序包org.aspectj.lang.annotation

    java: 程序包org.aspectj.lang.annotation不存在 #我自己已经配置好pom.xml文件,但是一直报错这个 aspectj 不存在 下面是我的pom.xml配置 可以看出来 ...

  3. 自然语言处理(NaturalLanguageProcessing,NLP)领域的100篇热门博客文章标题如下:

    目录 文章标题:<自然语言处理(Natural Language Processing,NLP)领域的100篇热门博客文章标题如下> 背景介绍: 随着人工智能技术的不断发展和普及,自然语言 ...

  4. 国标平台视频流抓取及rtp包解析

    最近遇到国标平台无法播放视频流的问题.需要检查视频接收端和播放端视频的收包和发包是否正常.但是只看pcap文件不是很直观,所以将pcap文件中的rtp包解析出来,用播放器将视频播放出来,以更直观的判断 ...

  5. 用postman模拟“授权代码授予”模式下获取Azure的用户信息(UserInfo)

    用postman模拟"授权代码授予"模式下获取Azure的用户信息(UserInfo) 1. 准备参数: 图1: 图2: 2. 调用: 点击按钮"Get New Acce ...

  6. 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题

    前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...

  7. Selenium:设置元素等待、上传文件、下载文件

    前言:在工作和学习selenium自动化过程中记录学习知识点,深化知识点 1. 设置元素等待 元素定位之元素等待-- WebDriver提供了两种类型的等待:显示等待和隐式等待. 1.1 显示等待 显 ...

  8. win10系统网络图标变成一个地球模型并且无法连上网络

    最近在家远程办公,但是遇到个很棘手的问题,电脑突然连不上无线网络了.... 无线网络图标变成地球模型如下:

  9. 动态SQL与静态SQL使用场景

    静态SQL 和动态SQL 的区别 静态SQL(或嵌入式SQL) 是应用程序中的 SQL 语句,它们在运行时不会更改,因此可以硬编码到应用程序中. 动态 SQL是在运行时构造的 SQL 语句:例如,应用 ...

  10. Blazor中CSS隔离无法用在子组件内部

    Blazor的CSS隔离是个很好的东西,如图,只需添加一个与Razor组件同名的CSS文件,这个文件中的CSS样式只会在同名的Razor组件中使用. 原理是通过在dom元素添加一个代表标识符的属性 在 ...