class字面来看是一个类,类里面无非就是属性和方法,内里面定义的变量可以被new实例化,在new的对象身上可以调取实例化的属性和方法,具有stats前缀的属性和方法在实例化的时候是无法直接挂载到实例对象身上,需要在实例化对象身上 .属性or方法。
class的使用可以极大的优化我们的代码,下面是class的使用方法
class loginClass {
// 这里定义变量 这个变量在nwe的时候,会自动挂载到对应的this上
username
password
constructor(params) {
/* 内部使用this的话,相当于是双向绑定
new 的时候,定义的属性会被直接实例化,实例化的值会对应显示到页面上
这个时候如果给页面做回显,需要将值传入class,此时的this就是内部的对应字段
this.name = params.name params是传入的参数,this.name是实例的值
传入的参数等于实例的值,实例的值会对应的在页面上做双向绑定
此时对应的页面就会根据实例的值回显内容
*/
this.username = params.username
}
// 这边的静态是为了防止new的时候挂载了这个实例 只有loginClass.rules的时候才会挂载
static rules = {
username : [
{ required: true, message: '请输入账号', trigger: 'blur' },
{ pattern:/^[a-zA-Z0-9]{2,8}$/, message: '仅允许2到8位字母和数字', trigger: 'blur' }
],
password : [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ pattern:/^[A-Za-z0-9\u4e00-\u9fa5]+$/, message: '不允许输入空格等特殊符号', trigger: 'blur'}
],
}
}
export { loginClass }
下面是在页面使用的方法
<template>
<div class='box' >
<div class="loginBox">
<div class="rightBox">
<div class="right_innerBox">
<div class="weclometitle Text">欢迎登录</div>
<!-- 账号密码表单 -->
<div class="LoginInput">
<el-form
ref="ruleFormRef"
:model="ruleForm"
:rules="loginClass.rules"
class="demo-ruleForm"
:size="formSize"
>
<!-- 账号 -->
<el-form-item aria-placeholder="请输入账号" prop="username">
<el-input class="userInput" v-model="ruleForm.username" />
</el-form-item>
<!-- 密码 -->
<el-form-item aria-placeholder="密码" prop="password">
<el-input class="passInput" v-model="ruleForm.password" type="password"/>
</el-form-item>
<div class="forgetBox">忘记密码</div>
<!-- 登录 -->
<el-form-item>
<el-button
class="ensure"
type="primary"
@click="submitForm(ruleFormRef)">登录</el-button>
</el-form-item>
<!-- 清空 -->
<el-form-item>
<el-button
plain class="merchant"
@click="resetForm(ruleFormRef)">我要成为商家</el-button>
</el-form-item>
</el-form>
</div>
<!-- 账号密码表单输入end -->
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive,ref } from 'vue';
import { useRouter } from 'vue-router'
import { loginClass } from './config'
import { login } from '@/server/login'
const router = useRouter()
const formSize = ref('default') // 字体大小
const ruleFormRef = ref() // 获取ref的表单节点 用于做重置和双向绑定
const ruleForm = reactive(new loginClass()) // 表单关联的数据 响应式的数据 使用reactive包裹 new loginClass
// 表单验证提示
const rules = reactive(
loginClass.rules
)
// 登录按钮
const submitForm = async (formEl) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('正在登录')
// 登录请求 登录的账号密码需要是字符串
ruleForm.password = String(ruleForm.password)
login(ruleForm)
.then(res=>{
console.log(res);
localStorage.setItem('token',res.data.data.token)
router.push('/home')
})
.catch(error=>{
ElMessage.error('网络错误,请联系服务商')
})
} else {
}
})
}
// 清空输入按钮
const resetForm = (formEl) => {
if (!formEl) return
formEl.resetFields()
}
</script>
<style scoped lang="less">
/* scoped 使用得定义的样式只在本页面内生效 */
.box{
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: space-around;
}
.loginBox{
width: 1000px;
background-color: rgba(255, 255, 255, 1);
border-radius: 10px;
display: flex;
overflow: hidden;
justify-content: space-around;
.rightBox{
border: 1px solid #eee;
text-align: center;
width: 500px;
height: 500px;
.right_innerBox{
width: 400px;
height: 500px;
margin: 0 auto;
.weclometitle{
width: 400px;
text-align: center;
height: 40px;
line-height: 40px;
// border: 1px solid red;
margin-top: 50px;
margin-bottom: 30px;
font-size: 18px;
}
.LoginInput{
width: 400px;
height: 120px;
// border: 1px solid gold;
.userInput,.passInput{
height: 40px;
}
}
// 提交按钮
.loginBtn{
width: 400px;
height: 40px;
line-height: 40px;
margin-top: 10px;
}
.merchantBtn{
width: 400px;
height: 40px;
line-height: 40px;
margin-top: 10px;
}
.explain{
width: 400px;
height: 40px;
text-align: center;
line-height: 40px;
// border: 1px solid cyan;
margin-top: 30px;
font-size: 10px;
color:#999999 ;
}
}
}
}
// 登录按钮
.ensure{
width: 400px;
height: 40px;
}
// 清空按钮
.merchant{
width: 400px;
height: 40px;
}
// 忘记密码
.forgetBox{
// border: 1px solid red;
text-align: right;
margin-top: 20px;
color: #94a1fd;
font-size: 14px;
margin-bottom: 10px;
}
</style>
class的具体用法和说明请看另一篇:【TS】class类和接口