Vue.js似乎成了一种潮流。

UI框架element-ui也跟着成了一种潮流,不过得承认,至少我个人还是非常认可的,element-ui做的是真不错。

用到element-ui,那么在dialog中搭配form就必不可少。

<el-dialog
:visible.sync="visible"
title="弹窗"
:before-close="beforeClose"
@open="openDialog"
width="480px"
>
<el-form
:model="form"
:rules="rules"
ref="form"
>
<el-form-item
label="操作人"
prop="operator"
>
<el-input
placeholder="请输入操作人"
v-model.trim="form.operator"
></el-input>
</el-form-item>
</el-form>
<div
slot="footer"
class="dialog-footer"
>
<el-button
@click="submit"
type="primary"
class="btn-custom"
>
<span>确 定</span>
</el-button>
</div>
</el-dialog>

弹窗内有form表单,而且这个表单需要校验,那么如果目前输入框校验报错之后,或者输入之后,关闭弹窗了,在当前页面,再次打开该弹窗,会显示上一次的输入值以及报错提示。

这就产生了一个小需求,弹框打开之后,需要把所有form表单重置为初始状态。需求很小,也很正常,然而解决这个问题,前期走了很多弯路。

查看一下,dialog的事件:

Events

事件名称 说明 回调参数
open Dialog 打开的回调 ——
opened Dialog 打开动画结束时的回调 ——
close Dialog 关闭的回调 ——
closed Dialog 关闭动画结束时的回调 ——

那么只能从这4个事件中考虑,要不在打开弹窗的时候,清除数据。要不在关闭弹窗的时候,清除数据。

比对之后,结合需求,可以考虑open,在弹框打开时清除数据,closed,弹框已经完全关闭之后,清除数据。

最开始,我是在closed之后,清除form表单的数据的。

在el-dialog标签上添加:

@closed="closeDialog"

添加方法:

closeDialog (formName) {
this.$refs[formName].resetFields()
}

这里容易产生一个新的问题,如果需要向上层组件传递form表单内用户填充的数据:

this.$emit('sendFormData', this.form)

也就是点击Form表单的提交按钮,需要干两件事:sendFormData和resetFields,这时,不管这段代码如何组织,在上层组件当中,接收到的值,必然是resetFields之后的值。

所以,必须要把这两件事分开来干,sendFormData放在close事件当中,或者before-close属性当中,然后在closed事件当中,再进行resetFields。

亦或者,在closed事件中,进行this.$emit('sendFormData', this.form)操作,然后在dialog open的时候,this.$refs[formName].resetFields()

这里有一点需要注意的是:

在第一次打开弹窗的时候,会产生一个错误提示

产生这么个错误的原因在于,初次打开弹窗,DOM节点还没有渲染完成,这时是取不到this.$refs[formName]的,那么跟着他调用resetFields这个函数,必然会报错。加一个简单的判断即可,if(this.$refs[formName]) this.$refs[formName].resetFields()

曾经踩过的坑,或者说还在踩着的坑,希望对即将会踩到的坑的同学们,有所帮助。

最新文章

  1. WIN7环境下CUDA7.5的安装、配置和测试(Visual Studio 2010)
  2. hdu4725最短路变形 添加点
  3. speechSynthesis
  4. Android Listview &amp; Adapter
  5. 直接拿来用!超实用的Java数组技巧攻略
  6. Android Unlock Patterns
  7. ubuntu系统安装redis
  8. Angular - - ngRoute Angular自带的路由
  9. 集成支付宝,报警告warning: (arm64) /Users/tommy/Desktop/Project/ios-msdk-git/AlipaySDK4Standard/AlipaySDK/Library/UTDI
  10. SQL Server2008进程堵塞处理方法
  11. js原型与原型链探究
  12. 实现我的第一个Java程序
  13. 【译】理解JavaScript中的柯里化
  14. SkyWalking+SkyApm-dotnet分布式链路追踪系统
  15. 关于 Container ,Injection
  16. 远程访问Centos6.5上的mysql或者mariadb(navicat)
  17. mac下如何找到hosts文件(转)
  18. &quot;XX cannot be resolved to a type &quot;eclipse报错及解决
  19. KVM虚拟化学习笔记系列文章列表(转)
  20. 获取lable选中时触发事件

热门文章

  1. 【Python】使用Python处理RAW格式图片,并根据实际情况完成分组打包发送
  2. asp.net core 控制静态文件的授权
  3. 【MYSQL】存储过程示例
  4. 深入理解Attention机制
  5. 使用STM32F103ZET霸道主板实现LCD显示屏显示
  6. Linux操作系统使用RPMBUILD命令打包RPM的详细步骤
  7. HDU 1087 最大递增子序列
  8. for 和 while 用于遍历时候的区别
  9. 2019-10-20 李宗盛 linux
  10. 阿里云Centos 7.6安装Redis以及开启远程连接