Vuetify `v-file-input` отправляет файл сразу после выбора файла, а не после нажатия кнопки отправки

#vue.js #axios #vuetify.js

#vue.js #axios #vuetify.js

Вопрос:

У меня есть компонент Vue, который фиксирует ввод файла от пользователя. Я хочу, чтобы ввод файла открывал файловый браузер, в котором пользователь может выбрать допустимый тип файла, а затем отобразить этот файл как выбранный файл в виде чипа. Когда пользователь нажимает submit , я хочу, чтобы был выполнен вызов axios для отправки файла в серверную часть.

Проблема в том, что, как только файл выбирается из файлового браузера, выполняется вызов axios — без нажатия пользователем кнопки отправки. Я все еще изучаю, как настроить фиктивный проект в Codepen. Однако мое приложение запускает компонент правильно.

 import { store, mutations } from "../../store.js"
import * as vuetify from "https://cdn.skypack.dev/vuetify@2.4.3";
import * as axios from "https://cdn.skypack.dev/axios@0.21.1";

export default {
  data() {
    return {
      upDocs: '',
      files: [],
      file: '',
      formData: new FormData()
    }
  },
  
  methods: {
    submitFile() {
      var FormData = require('form-data');
      var data = new FormData();
      data.append('File', this.file);
      
      var config = {
        method: 'post',
        url: 'https://someServer.com:8101/path/to/controller',
        headers: {
          'Content-Type' : 'multipart/form-data',
        },
        data : data
      };
      
      axios(config)
        .then(response => {
          console.log(JSON.stringify(response.data));
      })
    }
  }
  
}
 

Codepen

Ответ №1:

Вы пытаетесь связать click обработчик с v-bind сокращением, подобным этому:

 <v-btn :click="submitFile()">
 

Это фактически привязывает свойство с именем click к результату submitFile() (метод вызывается немедленно).

Вероятно, вы хотели использовать v-on сокращение следующим образом:

 <v-btn @click="submitFile()">

<!-- or -->
<v-btn @click="submitFile">