vue实现登录页面的表单验证

<!DOCTYPE html>
<html lang='en'>

<head>
    <meta charset='UTF-8' />
    <meta http-equiv='X-UA-Compatible' content='IE=edge' />
    <meta name='viewport' content='width=device-width, initial-scale=1.0' />
    <title>Document</title>
    <script src='https://unpkg.com/vue@next'></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<style>
    body {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 100vw;
        height: 100vh;
    }

    .form {
        width: 500px;
        border: 2px solid skyblue;
        padding: 30px 50px;
    }

    label {
        font-weight: 600;
        color: rgba(0, 0, 0, .7);
    }

    .btn {
        font-weight: 600;
        letter-spacing: 1px;
    }

    .top {
        margin-top: 10px;
    }
</style>

<body>
    <div id='app'></div>
    <template id='myroot'>
        <form class="form">
            <div class="form-row" :class="{top:!error.name}">
                <div class="col-md-12 mb-6">
                    <label for="name">用户名</label>
                    <input type="text" class="form-control" id="name" v-validate="validName" v-model="name">
                    <div class="invalid-feedback" v-if="error.name">
                        {{error.name}}
                    </div>
                </div>
            </div>
            <div class="form-row" :class="{top:!error.password}">
                <div class="col-md-12 mb-6">
                    <label for="password">密码</label>
                    <input type="password" class="form-control" id="password" v-validate="validPassword"
                        v-model="password" @keyup.enter="Submit">
                    <div class="invalid-feedback" v-if="error.password">
                        {{error.password}}
                    </div>
                </div>
            </div>
            <button class="btn btn-primary form-control" type="button"
                :style="error.password?'margin-top:10px':'margin-top:15px'" @click="Submit">登录</button>
        </form>
    </template>
    <script>
        const { reactive, toRefs, ref } = Vue
        const app = Vue.createApp({
            template: '#myroot',
            setup() {
                let login = reactive({
                    name: '',
                    password: '',
                    //错误对象
                    error: {},
                    //错误提示信息
                    message: {
                        name: '请输入用户名',
                        password: '请输入密码',
                    },
                })
                const { error, message } = login
                //验证 返回的成功对象
                let succeess = {
                    code: 200,
                    bind: (id) => error[id] = ''
                }
                //验证 返回的错误对象
                let err = {
                    code: 201,
                    bind: (id) => error[id] = message[id]
                }
                //验证姓名
                let validName = (name) => {
                    if (!name) return err
                    else return succeess
                }
                //验证密码
                let validPassword = (password) => {
                    if (!password) return err
                    else return succeess
                }
                //登录提交
                let Submit = () => {
                    const { password, name } = login
                    if (name == 'admin' && password == '123456') alert('登录成功')
                    else alert('登录失败')
                }
                return {
                    ...toRefs(login),
                    validName,
                    validPassword,
                    Submit
                }
            }
        })
        //自定义指令
        app.directive('validate', {
            mounted(el, binding) {
                el.addEventListener('blur', function () {
                    el.className = ''//清空类名
                    let { value: regExp } = binding//拿到验证方法
                    const result = regExp(el.value)//调用验证方法 得到返回对象
                    if (result.code == 200) el.className = 'form-control is-valid'//成功后调用成功样式
                    else el.className = 'form-control is-invalid'//失败后调用失败样式
                    result.bind(el.id)//调用返回对象方法 更新error对象
                })
            },
        })
        app.mount('#app')
    </script>
</body>

</html>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值