2016-10-20 71 views
0

我有一个组件,用户可以上传图片,我也想添加一个删除图片的功能。我添加了一个删除当前图像的按钮,但问题在于表单也被提交,我想避免这种情况。我只需要删除当前图像,如果它存在。这是脚本:Vue - 点击按钮提交表格

<template> 
    <div class="Image-input"> 
     <div class="Image-input__input-wrapper"> 
      <h2>+</h2> 
      <input @change="previewThumbnail" class="Image-input__input" name="image" type="file"> 
     </div> 

     <div class="Image-input__image-wrapper"> 
      <i v-show="! imageSrc" class="icon fa fa-picture-o"></i> 
      <img v-show="imageSrc" class="Image-input__image" :src="imageSrc"> 
      <button v-show="imageSrc" @click="removeImage">Remove image</button> 
     </div> 
    </div> 
</template> 
<script> 
export default { 

    props: ['imageSrc'], 

    methods: { 
    previewThumbnail: function(event) { 
     var input = event.target; 

     if (input.files && input.files[0]) { 
     var reader = new FileReader(); 

     var vm = this; 

     reader.onload = function(e) { 
      vm.imageSrc = e.target.result; 
     } 

     reader.readAsDataURL(input.files[0]); 
     } 
    }, 
    removeImage: function removeImage(e) { 
     this.imageSrc = ''; 
    } 
    } 
} 
</script> 

我试图与放置event.preventDefault()在removeImage方法,但是呢,如果我删除的图像后尝试上载同一个再不会上传。不知道该怎么办?

+0

尝试'预防'[事件修改器](https://vuejs.org/guide/events.html#Event-Modifiers) –

+0

我已经删除图像并尝试立即上传相同的图像后,它仍然赢得'上传。其他场景都可以运作,但只有这一点不适用。 – Marco

+0

你能为这个问题创建一个可用的JSfiddle吗? –

回答

3

如果您在表单中有一个按钮,它具有默认类型“submit”。为了防止这种情况发生,你必须设置type="button"如下:

<button type="button" v-show="imageSrc" @click="removeImage">Remove image</button> 

参考:Can I make a <button> not submit a form?

编辑:解决方案在评论#1提到的#5

第二个问题请修改您的reader.onload功能如下:

reader.onload = function(e) { 
    vm.imageSrc = e.target.result; 
    console.log("Clearing file input"); 
    document.querySelectorAll('input[type=file]').forEach(element => { 
     element.value = ""; 
    }); 
} 

正如您所看到的,我打印出一个控制台日志以进行调试(您可以将其删除),然后继续选择所有文件输入并重置其值。这将清除选定的文件。

注意:该清除功能发生在文件读入内存之后。如果你想它删除功能,你可以做如下:

removeImage: function removeImage(e) { 
    this.imageSrc = ""; 
    console.log("Clearing file input"); 
    document.querySelectorAll('input[type=file]').forEach(element => { 
     element.value = ""; 
    }); 
} 

选择是你的,无论你想读入内存,或者如果你想保持它在屏幕上后,清除文件名。让我知道它是否有效!

另一个注意事项:如果您的应用中有其他<input type="file">,即使这样也会被清除。但我认为你会将它读入内存并保存在一些局部变量中。为了避免这种情况,您需要修改document.querySelectorAll函数,通过给它一个类或ID来仅定位相关输入。

+0

是的,谢谢你,这是有效的!但后来我有另一个问题,这是我删除图像后,并尝试立即上传相同的图像,它仍然不会上传。其他场景都可以运作,只有这个场景没有。 – Marco

+0

是的,我可以在本地重现您的问题。我将你的代码复制到一个本地文件中,并添加了'console.log(“Got new image”);'作为previewThumbnail()函数的第一行。在此,我可以验证第二次尝试未按预期工作。如果我能找到解决方案,我会回来。 – Mani

+0

从我所看到的情况来看,旧文件仍保持为“已选”,并显示第一个文件名。我们需要的是在将图像作为数据URL读取之后清除表单的方法。 – Mani