尝试将VueJS与SemanticUI集成时,不会阻止表单提交

时间:2016-10-21 08:32:02

标签: javascript vue.js semantic-ui vue-component

我正在尝试将SemanticUI与Vue集成,我有一个带有表单的Login组件。

我已将v-on:submit.prevent="onSubmit"添加到表单中,但是当我在表单的某个字段上按Enter时,表单仍然提交,我的方法即从未调用过。

基本上我要做的是从jQuery复制on("submit"事件。

知道问题是什么?

main.js

import Vue       from "vue";
import VueRouter from "vue-router";
import App       from "./App";

Vue.use(VueRouter);

new Vue({
    el        : "#app",
    template  : "<App/>",
    components: { App }
});

和Login.vue

<template>
    <div class="ui middle aligned center aligned grid">
        <div class="column">
            <h2 class="ui teal header">
                Login
            </h2>

            <form class="ui large form login" v-on:submit.prevent="onSubmit">
                <div class="ui stacked segment">
                    <div class="field">
                        <div class="ui left icon input">
                            <i class="cloud icon"></i>
                            <input type="text" name="hostname" placeholder="Hostname" value="">
                        </div>
                    </div>

                    <div class="field">
                        <div class="ui left icon input">
                            <i class="user icon"></i>
                            <input type="text" name="username" placeholder="Username" value="">
                        </div>
                    </div>

                    <div class="field">
                        <div class="ui left icon input">
                            <i class="lock icon"></i>
                            <input type="password" name="password" placeholder="Password" value="">
                        </div>
                    </div>

                    <div class="ui fluid large teal submit button">Login</div>
                </div>
            </form>
        </div>
    </div>
</template>

<script>
    export default {
        name: "login",

        mounted: function() {
            this.$nextTick(function() {     
                jQuery(this.$el).find("form").form({
                    fields: {
                        hostname: {
                            identifier: "hostname",
                            rules     : [{
                                type  : "empty",
                                prompt: "Please enter the instance hostname"
                            }]
                        },

                        username: {
                            identifier: "username",
                            rules     : [{
                                type  : "empty",
                                prompt: "Please enter your username"
                            }]
                        },

                        password: {
                            identifier: "password",
                            rules     : [{
                                type  : "empty",
                                prompt: "Please enter your password"
                            }]
                        }
                    }
                });
            });
        },

        methods: {
            onSubmit: function(e) {
                alert("ok");
            }
        }
    };
</script>

1 个答案:

答案 0 :(得分:2)

如果表单具有以下其中一项,则表单将在ENTER键上提交:

  • 内部button没有 type="button"
  • input
  • type="submit"代码

您的表单似乎没有上述任何一种。但假设您在其他地方有一个提交按钮,以下是您可以避免表单提交的方法:

<form onsubmit="return false;">
    <input type="text" placeholder="Host Name" v-model="hostName">
    <input type="text" placeholder="User Name" v-model="userName">
    <input type="password" placeholder="Password" v-model="password">
    <input type="submit" value="Submit form">
</form>

请注意,表单中包含onsubmit="return false;",可防止意外提交。

这不会阻止您使用Vue组件中的方法,通过使用@click="submitLoginForm()"的按钮启动,使用this.$http.post(...)进行提交