zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    MongoDB Java连接---MongoDB基础用法(四)
    MongoDB用户,角色管理 --- MongoDB基础用法(三)
    Mongodb命令 --- MongoDB基础用法(二)
    MongoDB简介---MongoDB基础用法(一)
    Docker 私有仓库
    Dockerfile
    Docker部署Mysql, Tomcat, Nginx, Redis
    Docker 容器的数据卷
    封装的多功能多效果的RecyclerView
    安卓实现沉浸式效果,状态栏变色
  • 原文地址:https://www.cnblogs.com/wangyue99599/p/9041571.html
Copyright © 2011-2022 走看看