Form 表单
表单校验
基本使用
html
<div class="login-account">
<!-- model 表单数据对象 -->
<!-- rules 表单验证规则 -->
<el-form label-width="60px" :rules="rules" :model="account" ref="formRef">
<!-- prop 当前 input 的name -->
<el-form-item label="账号" prop="name">
<!-- 双向绑定 input 的value -->
<el-input v-model="account.name" />
</el-form-item>
<el-form-item label="密码" prop="password">
<!-- 显示是否查看密码 -->
<el-input v-model="account.password" show-password />
</el-form-item>
</el-form>
</div>
<div class="login-account">
<!-- model 表单数据对象 -->
<!-- rules 表单验证规则 -->
<el-form label-width="60px" :rules="rules" :model="account" ref="formRef">
<!-- prop 当前 input 的name -->
<el-form-item label="账号" prop="name">
<!-- 双向绑定 input 的value -->
<el-input v-model="account.name" />
</el-form-item>
<el-form-item label="密码" prop="password">
<!-- 显示是否查看密码 -->
<el-input v-model="account.password" show-password />
</el-form-item>
</el-form>
</div>
验证
js
//有父组件登录时点击后调用该函数
const loginAction = (isKeepPassword: boolean) => {
//执行form 表单校验
formRef.value?.validate((valid) => {
if (valid) {
// 1.判断是否需要记住密码
if (isKeepPassword) {
// 本地缓存
localCache.setCache('name', account.name)
//通常加密保存密码
localCache.setCache('password', account.password)
} else {
localCache.deleteCache('name')
localCache.deleteCache('password')
}
// 2.开始进行登录验证
store.dispatch('login/accountLoginAction', { ...account })
}
})
}
//有父组件登录时点击后调用该函数
const loginAction = (isKeepPassword: boolean) => {
//执行form 表单校验
formRef.value?.validate((valid) => {
if (valid) {
// 1.判断是否需要记住密码
if (isKeepPassword) {
// 本地缓存
localCache.setCache('name', account.name)
//通常加密保存密码
localCache.setCache('password', account.password)
} else {
localCache.deleteCache('name')
localCache.deleteCache('password')
}
// 2.开始进行登录验证
store.dispatch('login/accountLoginAction', { ...account })
}
})
}
校验规则
js
// 编写好规则
export const rules = {
//name 字段可以添加多个校验规则
//第一个规则,必填在没有填的情况下会提示 message
//第二个规则,在没有盘组pattern 的情况下会提示 message
name: [
{
required: true,
message: '用户名是必传内容~',
trigger: 'blur'
},
{
pattern: /^[a-z0-9]{5,10}$/,
message: '用户名必须是5~10个字母或者数字~',
trigger: 'blur'
}
],
password: [
{
required: true,
message: '密码是必传内容~',
trigger: 'blur'
},
{
pattern: /^[a-z0-9]{3,}$/,
message: '用户名必须是3位以上的字母或者数字~',
trigger: 'blur'
}
]
}
// 编写好规则
export const rules = {
//name 字段可以添加多个校验规则
//第一个规则,必填在没有填的情况下会提示 message
//第二个规则,在没有盘组pattern 的情况下会提示 message
name: [
{
required: true,
message: '用户名是必传内容~',
trigger: 'blur'
},
{
pattern: /^[a-z0-9]{5,10}$/,
message: '用户名必须是5~10个字母或者数字~',
trigger: 'blur'
}
],
password: [
{
required: true,
message: '密码是必传内容~',
trigger: 'blur'
},
{
pattern: /^[a-z0-9]{3,}$/,
message: '用户名必须是3位以上的字母或者数字~',
trigger: 'blur'
}
]
}
菜单栏
index
: 用于判断菜单是否是选中状态,不设置的话默认全部选中collapse
:boolean
属性 默认不折叠菜单。开启折叠之后 会有1px的 border-right ,通过覆盖 el-menu 属性来取消border
default-active:默认选中第几个菜单
active-text-color:文本选中的颜色
html
<template>
<div class="nav-menu">
<div class="logo">
<img class="img" src="~@/assets/img/logo.svg" alt="logo" />
<span v-if="!collapse" class="title">Vue3+TS</span>
</div>
<el-menu
default-active="2"
class="el-menu-vertical"
:collapse="collapse"
background-color="#0c2135"
text-color="#b7bdc3"
active-text-color="#0a60bd"
>
<template v-for="item in userMenus" :key="item.id">
<!-- 二级菜单 -->
<template v-if="item.type === 1">
<!-- 二级菜单的可以展开的标题,不添加index 属性,默认全部选中 -->
<el-submenu :index="item.id + ''">
<!-- 菜单标题放入 title 具名插槽中插槽 -->
<template #title>
<i v-if="item.icon" :class="item.icon"></i>
<span>{{ item.name }}</span>
</template>
<!-- 遍历里面的item,item 是放入默认插槽 -->
<template v-for="subitem in item.children" :key="subitem.id">
<el-menu-item
:index="subitem.id + ''"
@click="handleMenuItemClick(subitem)"
>
<i v-if="subitem.icon" :class="subitem.icon"></i>
<span>{{ subitem.name }}</span>
</el-menu-item>
</template>
</el-submenu>
</template>
<!-- 一级菜单 -->
<template v-else-if="item.type === 2">
<el-menu-item :index="item.id + ''">
<i v-if="item.icon" :class="item.icon"></i>
<span>{{ item.name }}</span>
</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template>
<template>
<div class="nav-menu">
<div class="logo">
<img class="img" src="~@/assets/img/logo.svg" alt="logo" />
<span v-if="!collapse" class="title">Vue3+TS</span>
</div>
<el-menu
default-active="2"
class="el-menu-vertical"
:collapse="collapse"
background-color="#0c2135"
text-color="#b7bdc3"
active-text-color="#0a60bd"
>
<template v-for="item in userMenus" :key="item.id">
<!-- 二级菜单 -->
<template v-if="item.type === 1">
<!-- 二级菜单的可以展开的标题,不添加index 属性,默认全部选中 -->
<el-submenu :index="item.id + ''">
<!-- 菜单标题放入 title 具名插槽中插槽 -->
<template #title>
<i v-if="item.icon" :class="item.icon"></i>
<span>{{ item.name }}</span>
</template>
<!-- 遍历里面的item,item 是放入默认插槽 -->
<template v-for="subitem in item.children" :key="subitem.id">
<el-menu-item
:index="subitem.id + ''"
@click="handleMenuItemClick(subitem)"
>
<i v-if="subitem.icon" :class="subitem.icon"></i>
<span>{{ subitem.name }}</span>
</el-menu-item>
</template>
</el-submenu>
</template>
<!-- 一级菜单 -->
<template v-else-if="item.type === 2">
<el-menu-item :index="item.id + ''">
<i v-if="item.icon" :class="item.icon"></i>
<span>{{ item.name }}</span>
</el-menu-item>
</template>
</template>
</el-menu>
</div>
</template>