vue-validator demo

本文介绍了一个基于Semantic UI和Vue.js构建的登录表单实例。该实例展示了如何利用Semantic UI的各种组件来美化表单,并通过Vue.js进行表单验证。文章详细介绍了表单的设计过程,包括样式设置、表单验证逻辑等。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">

    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/reset.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/site.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/container.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/grid.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/header.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/image.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/menu.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/divider.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/segment.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/form.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/input.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/button.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/list.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/message.min.css" />
    <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/semantic-ui/2.1.8/components/icon.min.css" />

    <style type="text/css">
        body {
            background-color: #DADADA;
        }

            body > .grid {
                height: 100%;
            }

        .image {
            margin-top: -100px;
        }

        .column {
            max-width: 450px;
        }
    </style>

</head>
<body>

    <div id="app" class="ui middle aligned center aligned grid">
        <div class="column">
            <h2 class="ui teal image header">
                <img src="http://www.semantic-ui.cn/examples/assets/images/logo.png" class="image">
                <div class="content">
                    Log-in to your account
                </div>
            </h2>
            <validator name="form">
                <form class="ui large form" :class="{ 'error': $form.invalid && trySubmit }" novalidate>
                    <div class="ui stacked segment">
                        <div class="field" :class="{ 'error': $form.email.invalid && trySubmit }">
                            <div class="ui left icon input">
                                <i class="user icon"></i>
                                <input type="email" v-model="item.email" placeholder="E-mail address" v-validate:email="{ required: true, email: true }">
                            </div>
                        </div>
                        <div class="field" :class="{ 'error': $form.password.invalid && trySubmit }">
                            <div class="ui left icon input">
                                <i class="lock icon"></i>
                                <input type="password" v-model="item.password" placeholder="Password" v-validate:password="{ required: true, minlength: 6 }">
                            </div>
                        </div>
                        <div @click="submit($form)" class="ui fluid large teal submit button">Login</div>
                    </div>
                    <div class="ui error message" v-if="trySubmit">
                        <ul class="list">
                            <li v-if="$form.email.required">Please enter your e-mail</li>
                            <li v-if="$form.email.email">Please enter a valid e-mail</li>
                            <li v-if="$form.password.required">Please enter your password</li>
                            <li v-if="$form.password.minlength">Your password must be at least 6 characters</li>
                        </ul>
                    </div>
                </form>
            </validator>
            <div class="ui message">
                New to us? <a href="#">Sign Up</a>
            </div>
        </div>
    </div>

    <script src="http://cdn.bootcss.com/vue/1.0.17/vue.min.js"></script>
    <script src="http://cdn.bootcss.com/vue-validator/2.0.0-alpha.22/vue-validator.min.js"></script>

    <script type="text/javascript">

        Vue.validator('email', function (val) {
            return /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i.test(val)
        })

        var vm = new Vue({
            el: '#app',
            data: function () {
                return {
                    item: {
                        email: null,
                        password: null,
                    },
                    trySubmit: false,
                }
            },
            methods: {
                onReset: function () {
                    this.$resetValidation()
                },
                submit: function (form) {
                    this.trySubmit = true
                    if (form.valid) {
                        this.$log('item')
                    }
                }
            }
        })
    </script>
</body>
</html>
`async-validator` 是一个轻量级、功能强大的异步验证库,主要用于前端开发中对用户输入的数据进行校验。它支持同步和异步规则配置,并且易于集成到各种应用程序中,包括 Vue 和 React 等现代 JavaScript 框架。以下是关于 `async-validator` 的详细介绍: ### 基本特点 - **简单易用**:API 设计简洁直观,能够快速上手; - **多种内置规则**:提供丰富的预定义验证规则如必填项 (required)、最小长度(minLength)、最大长度(maxLength),正则表达式(pattern)等; - **自定义规则**:允许开发者创建复杂的业务逻辑作为验证条件; - **国际化支持**:可以轻松地为错误消息添加多语言翻译; - **异步验证能力**:通过 Promise 实现非阻塞的远程 API 校验等功能; ### 安装与引入 你可以使用 npm 或 yarn 来安装此库: ```bash npm install async-validator --save # 或者 yarn add async-validator ``` 然后在你的项目文件里按需加载模块: ```javascript import Validator from 'async-validator'; // 或者直接全局引用 const Validator = require('async-validator'); ``` ### 示例代码 下面是一个简单的例子来演示如何使用 `async-validator` 进行表单字段的有效性检查。 #### 同步验证示例 ```javascript let descriptor = { username: [ { required: true, message: "用户名不能为空" }, { type: 'string', min: 3, max: 10, message: "用户名长度应在3~10之间"} ], password: [ { required: true, message: "密码不能为空"}, { pattern: /^[A-Za-z\d]{6,}$/, message: "密码只能包含字母数字组合,最少六位"} ] }; let validator = new Validator(descriptor); validator.validate({ username: '', password: '' }, function(errors){ if (errors) console.log("验证失败:", errors); else console.log("验证成功!"); }); ``` #### 异步验证示例 当涉及到像邮箱可用性的实时检测这样的场景时,我们可以利用它的异步特性来进行操作。 ```javascript let descriptor = { email: [{ required: true, type: 'email', message: '请输入正确的电子邮件地址' }, { // 自定义异步验证函数 asyncValidator(rule, value, callback) { setTimeout(() => { if (!value || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) return callback(new Error('无效邮件')); // Simulate an AJAX call to check availability. fetch('/api/check-email?email=' + encodeURIComponent(value)) .then(response => response.json()) .then(data => { data.available ? callback() : callback(new Error('该电子信箱已被注册')) }) .catch(callback); }, 500); // simulate delay for demo purposes only } }] }; let validator = new Validator(descriptor); validator.validate({ email: '' }, function(errorMessages) { console.log(errorMessages); }); ``` ### 配置选项解析 | 参数 | 描述 | |---|---| | rule.required | 字段是否必需,默认 false | | rule.type | 数据类型的限定,比如 string, number, object, array, boolean, enum, integer, float, method, regexp, date 等 | | rule.message | 错误提示信息模板字符串 | | rule.pattern | 正则表达式的实例或者源码串形式 | | rule.min/max | 数字型数据范围限制 | | rule.len | 字符串或数组的最大长度 | 除了上述提到的基础设置外还有更多高级配置可供探索,具体详情参阅[官方文档](https://github.com/yiminghe/async-validator/blob/master/API.md).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值