2020-02-02 解决Elment UI的dialog关闭后数据不刷新问题

1. 现象:

子组件中有一个 <vue-cropper> 图像裁剪插件:

<vue-cropper autoCrop :img="avatarSrc" ref="cropper" centerBox/>

通过变量avatarSrc来决定它的img属性,第一次加载的时候是OK的,每当avatarSrc改变的时候,图片都会更新。但是,当关闭这个dialog第二次加载后,更新就失灵了,不管你怎样改变avatarSrc的值,图片都不会变。

2. 解决:
方法1:

问题出在每次当我们隐藏这个dialog的时候,就真的只是隐藏,而不是销毁。elment UI的说明文档里有一个【destroy-on-close : 关闭时销毁 Dialog 中的元素】类似的属性,但是试了半天好像没什么用。于是又搜了半天,发现要给 dialog 加 v-if,当 v-if 为 false 的时候可以做到真正将之销毁而不是隐藏。这样一来,问题就很简单了,因为本来我们就有一个控制dialog隐藏与否的变量 dialogVisible,直接将他绑定给 v-if 即可:

<el-dialog
  title='我的资料'
  :modal="false"
  :visible.sync="dialogVisible"
  v-if="dialogVisible" //关键是这个
  width="500px"
  :close-on-click-modal="false"
  :destroy-on-close="true" //这个貌似没用
  :before-close="handleClose"
>
方法2:

此外,也可以通过动态创建input 的方法来解决这个问题,在这个方案中,文件选择框,即:<imput type="file">,不会出现在HTML模板中,而是通过代码实时创建:

 methods: {
    clickFile: function () {
      let e = document.createElement("input") //用代码创建文件选择框
      let vm = this
      e.type = "file"
      e.accept = "image/png, image/jpeg"
// 为他创建一个事件监听回调,当选择了一个文件后执行
      e.addEventListener('change', function () { 
        vm.loadImg(this.files[0])
      })
      e.click()
    },
    loadImg: function (file) { // 文件传入loadImg进行处理
      let vm = this
      if (window.FileReader) {
        let fr = new FileReader()
        fr.readAsDataURL(file) //开始加载文件
        fr.onload = function (e) {
          vm.avatarSrc = e.target.result
        }
      }
    },

实测,这样即使不使用 v-if ,也能实时更新,因为这个<input type="file">并不是HTML文档的一部分,也不是DOM的成员,它完全由代码创建,当退出函数的时候即已经被自动销毁了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rockage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值