【问题标题】:VueJs simple @click doesn't work inside a single file componentVueJs 简单的 @click 在单个文件组件中不起作用
【发布时间】: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 组件是否有任何问题?
  • 我做了你们所说的一切,但都没有奏效。我什至将组件标签放在表单之外只是为了测试它是否与表单有关,但点击事件仍然没有触发。这对我来说很奇怪。
  • 是的,如果从挂载的钩子中触发,函数确实会被调用

标签: laravel events vue.js


【解决方案1】:

这是因为形式。在表单中,除非指定,否则任何单击事件/按钮都将被视为提交(页面重新加载)。要阻止它提交,您可以执行以下操作

更多参考:https://vuejs.org/v2/guide/events.html

【讨论】:

  • 您好,感谢您的重播,但即使阻止了默认表单事件,问题仍然存在。我什至尝试将组件标签放在表单之外,以检查它是否有效,但它没有。还有其他想法吗?
  • 试试@click.native="uploadFiles"
猜你喜欢
  • 2019-03-26
  • 2018-11-11
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2013-03-23
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多