【问题标题】:Vuetify V-File-Input Multiple FilesVuetify V-File-输入多个文件
【发布时间】:2020-03-11 20:50:59
【问题描述】:

非常简单。试图显示多个文件,但只有一个会显示,因为数组中总是只有一个。添加另一个文件时,在它被覆盖之前上传的文件。 this.files 始终只是一个文件,并且不会添加。我怎样才能添加到文件中,而不是总是覆盖?任何帮助或方向将不胜感激。

<v-file-input
  v-model="files"
  small-chips
  show-size
  multiple
  clearable
>
  <template v-slot:selection="{ text, index, file }">
    <v-chip
      small
      text-color="white"
      color="#295671"
      close
      @click:close="remove(index)"
    >
      {{ text }}
    </v-chip>
  </template>
</v-file-input>
<script>
export default {
  data: () => ({
    files: []
  }),
  methods: {
    remove (index) {
      this.files.splice(index, 1)
    }
  }
}
</script>

工作示例:https://codepen.io/jhernandez_dev/pen/YzzRxMq?&editable=true&editors=101#anon-signup

【问题讨论】:

  • 让我问你一个小问题,你想选择、显示和上传多个文件吗?
  • 如果您要上传多个文件,那么this.files 应该是一个包含多个文件对象列表的数组。选择并上传多个文件后,您是否在 Vue Devtools 中检查了this.files
  • @GurkiratSingh 我希望能够上传多个,显示芯片。我已经有删除的能力,所以这很好。只是在 this.files 中有多个文件时遇到问题。添加其他文件时它总是被覆盖
  • @Angelo 是的,我有。每当我上传文件时,this.files 都会被覆盖,而不是向数组中添加另一个文件。当我 console.log this.files onChange 它总是显示最近添加的,但从不显示任何预先添加的。
  • 在帖子中添加了 codepen 示例以查看我所看到的确切内容

标签: vue.js vuetify.js


【解决方案1】:

我通过合并 2 个文件数组解决了这个问题。一个用于当前选定的文件,另一个用于所有文件...

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data: () => ({
    currFiles: [],
    files: []
  }),
  methods: {
    remove (index) {
      this.files.splice(index, 1)
    },
    inputChanged () {
      console.log(this.files)
      this.files = [
          ...this.currFiles,
          ...this.files
      ]
    }
  }  
})

Demo

【讨论】:

    【解决方案2】:

    你可以做一件事

    1. 创建一个隐藏的input 标签并添加对它的引用
    2. 创建一个带有前置图标的v-select 组件,并将外部图标作为操作的一部分

    模板

    <input type="file" hidden multiple ref="files" @change="listFiles">
    <v-select
      v-model="files"
      :items="files"
      chips
      readonly
      prepend-icon="attach_file"
      multiple
      @click="$refs.files.click()"
      @click:prepend="$refs.files.click()"
      @click:append-outer="uploadHere"
      label="Files"
      append-icon
      append-outer-icon="cloud_upload"
    ></v-select>
    

    脚本

    export default {
      data() {
        return {
          files: []
        };
      },
      methods: {
        listFiles() {
          this.files = [];
          for (let i = 0; i < this.$refs.files.files.length; i++)
            this.files.push(this.$refs.files.files[i].name);
        },
        uploadHere()
        {
          console.log("Uploading");
          let formData = new FormData();
    
          // iteratate this.$refs.files.files
    
          // add data to formData
    
          // Post the form data with 'Content-Type': 'multipart/form-data' via fetch or Axios
        
          console.log("Uploaded");
          this.files = []
        }
      },
      created() {}
    };
    

    PS:这是一种方法。如果您发现任何理解困难,请在下方评论

    【讨论】:

    • 这是否意味着我试图完成的工作不适用于 vuetify 的 v-file-input?感谢您帮助我了解另一种方法。
    • @Zeus 问题是我没有使用 v-file-input 所以这在我的情况下效果很好。如果您有其他解决方案,也可以回答您的问题并帮助我们
    【解决方案3】:

    你可以尝试做这样的事情。

    <template>
      <v-file-input
        id="uploadedfiles"
        v-model="files"
        show-size
        counter
        multiple
        clearable
        label="File input"
        name="uploadedfiles"
        :rules="[filesizeLimit]"
        @change="inputChanged"
      >
        <template #selection="{ index, text }">
          <v-chip small label close color="primary" @click:close="deleteChip(index, text)">{{ text }}</v-chip>
        </template>
      </v-file-input>
    </template>
    
    <script>
    export default {
      methods: {
        deleteChip(index, text) {
          // Prompt here with text if required
          this.previousFiles.splice(index, 1)
          this.files = this.previousFiles
        },
        inputChanged() {
          this.files = []
          const uploadedFiles = this.$refs.form.$el.querySelector('#uploadedfiles').files
          for (let i = 0; i < uploadedFiles.length; i++) {
            if (
              this.previousFiles !== undefined &&
              this.previousFiles !== null &&
              this.previousFiles.length <= 0
            ) {
              this.previousFiles.push(uploadedFiles[i])
            } else {
              const index = this.previousFiles.findIndex((x) => x.name === uploadedFiles[i].name)
              if (index >= 0) {
                this.previousFiles.splice(index, 1)
              }
              this.previousFiles.push(uploadedFiles[i])
            }
          }
          this.files = this.previousFiles
        },
      },
    }
    </script>
    

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多