【问题标题】:Vue - button on click submits a formVue - 单击按钮提交表单
【发布时间】:2022-01-07 11:44:27
【问题描述】:

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

<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>

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

【问题讨论】:

  • 试试prevent event modifier
  • 我删除了图片并尝试立即上传同一张图片后,仍然无法上传。其他所有场景都有效,只有这个无效。
  • 您能否为该问题创建一个有效的 JSfiddle?

标签: javascript vue.js


【解决方案1】:

如果表单中有一个按钮,它的默认类型是“提交”。为防止这种情况发生,您必须将type="button" 设置如下:

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

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

编辑:cmets #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 = "";
    });
}

您可以选择在读入内存后清除文件名还是将其保留在屏幕上。让我知道它是否有效!

另一个注意事项:如果您的应用中有任何其他&lt;input type="file"&gt;,即使它也会被清除。但我假设您已经将其读入内存并将其保存在一些局部变量中。为避免这种情况,您需要修改 document.querySelectorAll 函数,通过为其指定类或 id 以仅针对相关输入。

【讨论】:

  • 是的,谢谢,这行得通!但是后来我遇到了另一个问题,即在我删除图像并尝试立即上传相同的图像后,它仍然不会上传。其他所有场景都有效,只有这个无效。
  • 是的,我可以在本地重现您的问题。我将您的代码复制到本地文件中,并将console.log("Got new image"); 添加为 previewThumbnail() 函数的第一行。在此,我可以验证第二次尝试没有按预期工作。如果我能找到解决方案,我会回来。
  • 据我所见,旧文件仍然保持为“选择”,并显示第一个文件名。我们需要的是一种在将图像作为数据 URL 读取后清除表单的方法。
  • 是的,我不知道该怎么做,不幸的是我对javascript不太擅长。如果您有任何解决方案,我将非常感谢!无论如何谢谢!
  • 这看起来很有趣...我可以上传一个完全不同的图像并且它可以正常工作。上传 image1.png 后,我可以删除并上传 image2.png。删除 image2.png 后,我可以毫无问题地返回 image1.png。只有同一张图片没有上传,可能是因为该文件已经处于选定状态。仍在调试,因为这稍后也会影响我的应用程序,如果我能找到方法,我会回来。
猜你喜欢
  • 2020-12-03
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2011-12-28
相关资源
最近更新 更多