在vue.js中更改文件输入

Ash*_*y B 38 javascript vue.js vue-component vuejs2

使用纯HTML/JS,可以查看输入元素的所选文件的JavaScript File对象,如下所示:

<input type="file" id="input" multiple onchange="handleFiles(this.files)">
Run Code Online (Sandbox Code Playgroud)

但是,当将其转换为'Vue'方式时,它似乎不会按预期工作,只返回undefined而不是返回File对象数组.

这是它在我的Vue模板中的样子:

<input type="file" id="file" class="custom-file-input" 
  v-on:change="previewFiles(this.files)" multiple>
Run Code Online (Sandbox Code Playgroud)

previewFiles函数就是(位于方法)的情况如下:

  methods: {
    previewFiles: function(files) {
      console.log(files)
    }
  }
Run Code Online (Sandbox Code Playgroud)

这样做有替代/正确的方法吗?谢谢

Ikb*_*bel 58

试试这个.

<input type="file" id="file" ref="myFiles" class="custom-file-input" 
  @change="previewFiles" multiple>
Run Code Online (Sandbox Code Playgroud)

并在您的组件选项中:

data() {
  return {
    files: [],
  }
},
methods: {
  previewFiles() {
    this.files = this.$refs.myFiles.files
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @ user305883当然,Vue将组件模板中具有“ ref”属性的所有DOM元素添加到组件实例中的对象“ $ refs”中,您可以在组件方法或生命周期挂钩中使用它来直接访问DOM元素。在这种情况下,我们要检索存储在名为“ myFiles”的“ input”中的“ files”数组。 (3认同)

obo*_*hto 58

另一种方案:

<input type="file" @change="previewFiles" multiple>

methods: {
   previewFiles(event) {
      console.log(event.target.files);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来比所选答案更好 (10认同)
  • 也许从 JavaScript 计划的角度来看,这看起来更好,但所选的答案看起来更符合 vue 习惯。 (3认同)
  • @Antony 这怎么更惯用? (2认同)
  • 这是更干净的答案。 (2认同)

Mik*_*rer 6

对于所有的 TS 用户:

<template>
<input ref="upload"
       type="file"
       name="file-upload"
       multiple=""
       accept="image/jpeg, image/png"
       @change="onUploadFiles">
</template>
Run Code Online (Sandbox Code Playgroud)
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component({ components: {} })
export default class MediaEdit extends Vue {

private onUploadFiles(event: InputEvent): void {
    const files: ReadonlyArray<File> = [...(this.upload.files ? this.upload.files : [])];

        files.forEach((file) => {
            console.log(`File: ${file.name}`);
        });
    }

    /** Upload element */
    private get upload(): HTMLInputElement {
        return this.$refs.upload as HTMLInputElement;
    }
}

Run Code Online (Sandbox Code Playgroud)


vov*_*sko 5

<form ref="form">
   <input type="file" @change="previewFiles" multiple tabindex="-1">
</form>

methods: {
   previewFiles(event) {

      // process your files, read as DataUrl or upload...
      console.log(event.target.files);

      // if you need to re-use field or drop the same files multiple times
      this.$refs.form.reset() 

   }
}
Run Code Online (Sandbox Code Playgroud)

@input/change在 Safari 上,您可能会遇到事件无法触发的问题。

tabindex="-1"- 这是一个让它在 Safari (13.0.2) 上运行的魔术