【发布时间】:2018-06-11 10:00:54
【问题描述】:
组件模板中定义的方法 simple 不会触发。 单击上传按钮时,我希望触发 uploadFiles 方法,以便在用户提交表单之前上传图像。
我只是不明白为什么它不起作用。我也尝试了 v-on:click="uploadFiles" 仍然没有运气。
顺便说一句,我正在使用 Laravel。
HTML 表单
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">Create a new project</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<form method="post" action="/project/store">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" name="title" id="title">
</div>
<div class="form-group">
<label for="title">Subtitle</label>
<input type="text" class="form-control" name="subtitle" id="subtitle">
</div>
<div id="app">
<upload-project-image></upload-project-image>
</div>
<div class="form-group">
<label for="sel2">Mutiple select list (hold shift to select more than one):</label>
<select multiple class="form-control" id="categories" name="categories[]">
@foreach($categories as $category)
<option value="{{$category->id}}">{{$category->name}}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="exampleFormControlTextarea1">Description</label>
<textarea name="body" class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea>
</div>
<button class="btn-primary">Submit</button>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
app.js
require('./bootstrap');
window.Vue = require('vue');
Vue.component('upload-project-image', require('./components/UploadImage.vue'));
const app = new Vue({
el: '#app'
});
组件
<template>
<div>
<div class="form-group">
<label for="sel2">Select Project Images</label>
<div class="input-group">
<div class="custom-file">
<input type="file" class="custom-file-input" name="files[]"
id="files" multiple>
<label class="custom-file-label" for="inputGroupFile02">{{numberOfFiles}}</label>
</div>
<div class="input-group-append">
<button class="btn btn-outline-secondary" @click="uploadFiles" type="button">Upload</button>
</div>
</div>
</div>
</div>
</template>
<script>
export default{
data(){
return{
files:{},
numberOfFiles: 0
}
},
methods:{
uploadFiles(){
console.log("Nothing gets printed to the console");
},
uploadSongs(){
const fileInput = document.querySelector( '#files' );
const files = fileInput.files;
this.numberOfFiles = files.length;
for(let i=0; i < files.length; i++){
let formData = new FormData();
formData.append('files[]', files[i]);
axios.post( '/upload', formData ).then( ( response ) => {
console.log(response);
})
}
}
}
}
</script>
【问题讨论】:
-
我没有任何想法,但尝试将按钮设置为
a标签而不是button,它与 CSS 类看起来仍然相同。 -
您正在处理表单。您的点击是否可能由默认处理程序处理?如果是这样,可以通过这样做来解决:@click.prevent
-
尝试添加挂载的钩子和控制台日志来测试渲染你的 vue 组件是否有任何问题?
-
我做了你们所说的一切,但都没有奏效。我什至将组件标签放在表单之外只是为了测试它是否与表单有关,但点击事件仍然没有触发。这对我来说很奇怪。
-
是的,如果从挂载的钩子中触发,函数确实会被调用