当前位置: 首页 > 编程笔记 >

解决vue项目中type=”file“ change事件只执行一次的问题

寇丰
2023-03-14
本文向大家介绍解决vue项目中type=”file“ change事件只执行一次的问题,包括了解决vue项目中type=”file“ change事件只执行一次的问题的使用技巧和注意事项,需要的朋友参考一下

问题描述

在最近的项目开发中遇到了这样的一个问题,当我上传了一个文件时,我将获取到的文件名清空后,却无法再次上传相同的文件

<template>
 <div class="hello">
   <input type="button" value="上传文件" name="" id="" @click="updata">
   <input type="file" style="display:none" @change="getFile" id="input-file">
   <div v-if="fileName">
    <p>上传的文件名:{{fileName}}</p>
    <button @click="delFile">清空文件</button>
   </div>
 </div>
</template>
<script>
import $ from 'n-zepto'
export default {
 name: 'HelloWorld',
 data () {
  return {
   fileName: ''
  }
 },
 methods:{
  updata(){ // 唤起change事件
   $('#input-file').click()
  },
  getFile(e){ // change事件
   this.doSomething()
  },
  doSomething(){ // do something
   this.fileName = e.target.files[0].name
  },
  delFile(){
   this.fileName=''
  }
 }
}
</script>

因为我只是将data中的属性值清空而已,文件名没有变当然会不出发change事件

解决办法

目前网上有好多解决办法,但基本上都无法在vue上使用,于是我想到了v-if

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

于是在代码中加入了一个小的开关,唤起change事件时就将他销毁

事件结束时再将它重建,这样问题就轻松的解决了

<template>
 <div class="hello">
   <input type="button" value="上传文件" name="" id="" @click="updata">
   <input v-if="ishowFile" type="file" style="display:none" @change="getFile" id="input-file">
   <div v-if="fileName">
    <p>上传的文件名:{{fileName}}</p>
    <button @click="delFile">清空文件</button>
   </div>
 </div>
</template>

<script>
import $ from 'n-zepto'
export default {
 name: 'HelloWorld',
 data () {
  return {
   fileName: '',
   ishowFile: true,
  }
 },
 methods:{
  updata(){ // 唤起change事件
   $('#input-file').click()
   this.ishowFile = false // 销毁
  },
  getFile(e){ // change事件
   this.doSomething()
   this.ishowFile = false // 重建
  },
  doSomething(){ // do something
   this.fileName = e.target.files[0].name
  },
  delFile(){
   this.fileName=''
  }
 }
}
</script>

总结

以上所述是小编给大家介绍的vue项目中解决type=”file“ change事件只执行一次的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 试图实现Spring批处理,但面临一个奇怪的问题,我们的类只执行了一次。 以下是细节。 如果我们在DB中有1000行。 我们的项目阅读器从DB中获取1000行,并将列表传递给 成功删除所有项目。 现在ItemReader再次尝试从数据库中获取数据,但没有找到,因此返回NULL,因此执行停止。 但是我们已经将批处理配置为使用调度器执行,这是每分钟执行一次。 现在,如果我们通过转储导入在DB中插入让我

  • 我正在设计一个指导决策表来执行一些工作项,这些工作项只是在executeWorkItem函数中打印一些文本。 在工作台设置中,我已经将工作项处理程序添加到有状态会话中。另外,我在一个wid文件中定义了它们。 没有条件检查,只是因为我想在每次有请求发送到KIE服务器时触发它。 这是向KIE服务器激发的请求 我可以看到工作项在第一次向KIE服务器激发请求时被执行。然而,它不再运行,因为我不能看到任何打

  • 本文向大家介绍Vue项目中跨域问题解决方案,包括了Vue项目中跨域问题解决方案的使用技巧和注意事项,需要的朋友参考一下 方法 后台更改header 使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建) Jquery jsonp 后台更改header 使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建) 打开config

  • 本文向大家介绍jQuery不兼容input的change事件问题解决过程,包括了jQuery不兼容input的change事件问题解决过程的使用技巧和注意事项,需要的朋友参考一下 最近开发一个项目,需要实现用户在WEB表单里的多个INPUT框中输入数量后,立即自动计算加总各项输入的数量之和,并显示在指定的INPUT框中,这个功能实现的原理是简单的,就是只需要在INPUT的onchange事件中计算

  • 本文向大家介绍vue项目中使用lib-flexible解决移动端适配的问题解决,包括了vue项目中使用lib-flexible解决移动端适配的问题解决的使用技巧和注意事项,需要的朋友参考一下 第一部分:项目中引入lib-flexible 一、项目中安装lib-flexible 二、在项目的入口js文件中引入lib-flexible 通过要以上两步,就完成了在vue项目使用lib-flexible来

  • 我正在学习angularjs,作为一个测试项目,我正在轮询一个返回活动进程列表(它们的pid)并显示这些进程的服务器。 客户端代码如下所示: 这适用于Firefox和Chrome,但不太适用于Internet Explorer 11。 所有浏览器每秒都执行ReloadData方法,但IE11实际上并不从服务器获取流程数据。Firefox和Chrome确实每秒都会获取数据。我也可以在服务器的输出中看