vue3 antv 静态登录页面

效果图

<template>
<!-- 内容区域 -->
  <div class="main">
    <div class="from">
    <!-- 表单 model是antv里边的绑定表单数据 -->
    <a-form :model="formState" ref="formRef">
      <!-- 切换 -->
      <a-tabs :activeKey="data.customActiveKey" @change="handleTabClick">
        <a-tab-pane key="tab1" tab="账号密码登录">
          <a-form-item name="account" :rules="[{required:true,message:'请输入你的用户名'},{validator:handlUsernameOrEmail}]">
              <a-input size="large" type="text" placeholder="账户名邮箱地址" v-model:value="formState.account">
                <!-- prefix:是放在input前边 vue2 写插槽    <template slot="prefix"><user-outlined /></template> -->
                 <template #prefix><user-outlined /></template>
              </a-input>
          </a-form-item>
          <a-form-item  name = "password" :rules="[{required:true,message:'请输入你的密码'},]">
            <a-input size="large" type="password" placeholder="密码" autocomplete="false" v-model:value="formState.password">
               <template #prefix><lock-outlined /></template>
            </a-input>
          </a-form-item>
        </a-tab-pane>
           <a-tab-pane key="tab2" tab="手机号登录">
            <a-form-item>
                <a-input size="large" type="text" placeholder="手机号">
                    <template #prefix><mobile-outlined/></template>
                </a-input>
            </a-form-item>
            <a-row :gutter="16">
              <a-col :span = "16">
                <a-input size="large" type="text" placeholder="验证码">
                  <template #prefix><mail-outlined /></template>
                </a-input>
              </a-col>
              <a-col :span="8">
                <!-- blcok占据一行 -->
                <a-button blcok type="primary">获取验证码</a-button>
              </a-col>
            </a-row>
          </a-tab-pane>
      </a-tabs>

      <a-form-item class="autologin">
        <a-checkbox v-model:checked="formState.rememberMe">自动登录</a-checkbox>
        <router-link to="/user/forget">忘记密码</router-link>
      </a-form-item>

      <a-form-item>
          <a-button size="large" type="primary" htmlType="submit" block @click="submitFn">登录</a-button>
      </a-form-item>

      <div class="user-login-other">
        <span>其他登录方式</span>
        <router-link :to="{ name:'register'}">注册账户</router-link>
      </div>
    </a-form>
    </div>
  </div>
</template>
<script setup>
import { UserOutlined,LockOutlined,MobileOutlined,MailOutlined } from '@ant-design/icons-vue';
import { reactive, ref, onMounted } from "vue";
const formState = reactive({
  account: "",
  password:'',
  rememberMe:true,
});
const data = reactive({
// 绑定tab的key值
  customActiveKey:"tab1",
})
const formRef = ref();
onMounted(()=>{
  console.log('ref',formRef.value);
})
// 登录事件
async function submitFn(){
  if(data.customActiveKey === 'tab1'){//根据tab1来效验不同的内容
    try{
      const values = await formRef.value.validateFields(["account","password",]);//效验账号和密码
      console.log('succes',values);
      // 根据tab切换的情况,执行不同的登录流程
    }catch(error){
      console.log('error',values);
    } 
  }

}
// 效验
function handlUsernameOrEmail(rules,value,){
  const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+){1,2}$/;
  if(regex.test(value)){
    return Promise.resolve('成功');
  }else {
    return Promise.reject('账号是邮箱,请输入正确的邮箱');
  }
}
// 点击事件
function handleTabClick(key){
  data.customActiveKey = key;
}
</script>
<style lang="less" scoped>
.main{
  display: flex;
  justify-content: center;
  align-items: center;
}
.from{
  width: 450px;
  padding: 25px;
  border-radius: 10px;
  background-color:rgba(233,233,233,0.7) ;
}
:deep(.autologin .ant-form-item-control-input-content), .user-login-other{
  display: flex;
  justify-content: space-between;
}
</style>
相关推荐
理想不理想v1 分钟前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云11 分钟前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:1379712058713 分钟前
web端手机录音
前端
齐 飞19 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
神仙别闹36 分钟前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
aPurpleBerry1 小时前
JS常用数组方法 reduce filter find forEach
javascript
GIS程序媛—椰子1 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_0012 小时前
前端八股文(一)HTML 持续更新中。。。
前端·html
ZL不懂前端2 小时前
Content Security Policy (CSP)
前端·javascript·面试
乐闻x2 小时前
ESLint 使用教程(一):从零配置 ESLint
javascript·eslint