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

Posted

技术标签:

【中文标题】如何使用 vue.js 2 提交表单?【英文标题】:How to submit a form using vue.js 2? 【发布时间】:2018-06-01 08:50:49 【问题描述】:

我的视图刀片 laravel 是这样的:

<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 不是函数

我该如何解决这个错误?

【问题讨论】:

你试过vue提供的事件监听器@submit吗?而不是:action ? @John Rey M. Baylen,我更新了我的问题。所以从组件中标记表单 【参考方案1】:

您需要在&lt;form&gt; 元素(即组件的根元素)上调用submit()

this.$el.submit();

编辑:由于您更新了问题,上述内容不再适用。

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

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

如果您的组件是紧密耦合的,这很好,否则更简洁的解决方案是 $emit 来自您的 &lt;search-header-view&gt; 组件的事件并在父组件中响应它,如下所示:

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();
  

【讨论】:

它不起作用。存在错误:TypeError: this.$el.submit is not a function 我再次需要你的帮助。看看这个:***.com/questions/47879651/…【参考方案2】:

如果它说submit is not a function,即使您用$refs 正确引用它: 看起来如果表单控件具有提交的名称或 ID,它将掩盖表单的提交方法。 在我的情况下,我的提交按钮上有name="submit",我删除了它,它工作正常。

【讨论】:

【参考方案3】:

只需为您的表单提供@submit 侦听器即可:

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

以及相关的方法:

methods: 
  submited (e) 
    // e is the form event, e.target is the form, do your things on submit
  

【讨论】:

以上是关于如何使用 vue.js 2 提交表单?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ajax 在 Vue.js 中提交表单

使用 Vue.js 和 Axios 向 Mailchimp 提交表单会导致 CORS 错误

从 Vue js 中的模态提交表单

axios表单提交--vue.js

Vue.js - Element UI - 如何知道表单验证的状态

如何正确地将数据从 vue 组件发布到 laravel 控制器