背景

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

  • 在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. K8S | 核心原理分析

    目录 一.背景 二.持续集成 三.K8S架构 1.核心组件 2.分层结构 3.核心能力 3.1 发现与负载 3.2 调度 3.3 自动伸缩 四.应用案例 1.服务部署 2.交互流程 五.参考源码 整体 ...

  2. Mybatis的parameterType造成线程阻塞问题分析

    一.前言 最近在新发布某个项目上线时,每次重启都会收到机器的 CPU 使用率告警,查看对应监控,持续时长达 5 分钟,对于服务重启有很大风险.而该项目有非常多 Consumer 消费,服务启动后会有大 ...

  3. [AGC055B] ABC Supremacy 题解

    [AGC055B] ABC Supremacy 题解 题目描述 给定两个长度为 \(n\) 的字符串 \(a\),\(b\). 你可以进行若干次以下操作: 若 \(a\) 中的一个子串为 ABC,BC ...

  4. Nanoframework 操作单片机蓝牙配置WIFI的案例

    Nanoframework 操作单片机蓝牙配置WIFI的案例 通过Nanoframework的蓝牙配置Wifi的名称和密码 下面是基本需要的工具 ESP32设备一个 需要支持蓝牙和wifi,一般情况的 ...

  5. V8是如何执行JavaScript代码的?

    前言 一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个翻译程序将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言.目前市面上有很多种 JavaScri ...

  6. 如何在 Python 中实现遗传算法

    前言 遗传算法是一种模拟自然进化过程与机制来搜索最优解的方法,它由美国 John Holland 教授于20世纪70年代提出.遗传算法的主要思想来源于达尔文生物进化论和孟德尔的群体遗传学说,通过数学的 ...

  7. .Net全网最简Redis操作

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. Redis作为一款主流的缓存工具在业内已广受欢迎.本文将会介绍操作R ...

  8. Blazor 跨平台的、共享一套UI的天气预报 Demo

    1. 前言 很久之前就读过 dotnet9 大佬的一篇文章,MAUI与Blazor共享一套UI,媲美Flutter,实现Windows.macOS.Android.iOS.Web通用UI,没读过的可以 ...

  9. 代码随想录算法训练营第二天| LeetCode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 文章讲解:https://programmercarl ...

  10. Go语言中指针详解

    指针在 Go 语言中是一个重要的特性,它允许你引用和操作变量的内存地址.下面是指针的主要作用和相关示例代码: 1. 引用传递 在 Go 中,所有的变量传递都是值传递,即复制变量的值.如果你想在一个函数 ...