如何使用vue.js 2提交表单?

时间:2017-12-18 23:56:45

标签: javascript vue.js vuejs2 vue-component vuex

我的视图刀片如下:

<form slot="search" class="navbar-search" action="{{url('search')}}">
    <search-header-view></search-header-view>
</form>

视图刀片laravel调用vue组件(search-header-view组件)

我的vue组件(search-header-view组件)如下:

<template>
    <div class="form-group">
        <div class="input-group">
            <input type="text" class="form-control" placeholder="Search" name="q" autofocus v-model="keyword">
            <span class="input-group-btn">
                <button class="btn btn-default" type="submit" id="submit-search"><span class="fa fa-search"></span></button>
            </span>
            <ul v-if="!selected && keyword">
                <li v-for="state in filteredStates" @click="select(state.name)">{{ state.name }}</li>
            </ul>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'SearchHeaderView',
        data() {
            return {
                baseUrl: window.Laravel.baseUrl,
                keyword: null,
                selected: null,
                filteredStates: []
            }
        },
        watch: {
            keyword(value) {
                this.$store.dispatch('getProducts', { q: value })
                .then(res => {
                    this.filteredStates = res.data;        
                })
            }
        },
        methods: {
            select: function(state) {
                this.keyword = state
                this.selected = state
                document.getElementById('submit-search').submit()
            },
            input: function() {
                this.selected = null
            }
        },    
    }
</script>

我想在用户点击关键字

时提交表单

我尝试使用document.getElementById('submit-search')。submit()

但是在控制台上存在这样的错误:

  

TypeError:document.getElementById(...)。submit不是函数

如何解决此错误?

3 个答案:

答案 0 :(得分:3)

您需要在submit()元素(组件的根元素)上调用<form>

this.$el.submit();

编辑:由于您已更新了问题,因此上述问题不再适用。

要触发按钮单击,只需在按钮元素上调用click()

<button ref="submitButton">Foo</button>
this.$refs.submitButton.click();

如果您的组件要紧密耦合,这很好,否则一个更清晰的解决方案是$emit来自<search-header-view>组件的事件并在父组件中响应它,就像这样:

this.$emit('submit');

在父组件中:

<search-header-view @submit="submit">
methods: {
  submit() {
    // Submit the form manually here (add a ref to your form element)
    this.$refs.form.submit();
  }
}

答案 1 :(得分:1)

只需在表单中提供@submit监听器:

<form slot="search" class="navbar-search" @submit="submited">
  <search-header-view></search-header-view>
</form>

以及相关的方法:

methods: {

  submited (e) {
    // e is the form, do your things on submit
  }
}

答案 2 :(得分:0)

即使您引用submit is not a function时,它说$refs也是如此: 看起来,如果表单控件具有提交的名称或ID,它将掩盖表单的Submit方法。 在我的情况下,我的提交按钮上有name="submit",我将其删除了,并且效果很好。