Vue - 点击按钮提交表单

时间:2016-10-20 08:23:37

标签: javascript vue.js

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

<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方法中,但是,如果我在删除图片后尝试再次上传相同的图片,则无法上传。不知道该怎么办?

1 个答案:

答案 0 :(得分:7)

如果表单中有按钮,则默认类型为“提交”。为防止这种情况发生,您必须按如下方式设置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来定位相关输入。