Vue Form表单的使用,rules格式校验网络校验,键盘按键监听

Form表单

rules格式校验

  • 可以在validator中进行网络请求,实现网络校验
js 复制代码
const formRules = {
  userName: [{required: true, message: "用户名不能为空", trigger: 'blur'}, {
    min: 5,
    max: 10,
    message: "长度必须5-10位",
    trigger: 'blur'
  }],
  passWord: [{required: true, message: "密码不能为空", trigger: 'blur'}],
  reference: [{
    validator: referenceValidity,
    required: true,
    trigger: "blur",
  },],
}

function referenceValidity(rule, value, callback) {
  console.log('校验推荐人')
  if (value === "" || value === undefined) {
    callback(new Error("请输入推荐人姓名"));
  } else {
    //请求网络校验推广人
    // console.log("输入的推荐人姓名:" + value)
    // const _url = "xxxxxxxxxxx";
    // let param = {};
    // param.promotionPecialistName = value;
    // get(this.$http, _url, param).then(function (response) {
    //   let res = response.data;
    //   if (res.code === "I000000") {
    //     if (res.data.isFlag) {
    //       callback()
    //     } else {
    //       callback(new Error("推荐人不存在"))
    //     }
    //   } else {
    //     callback(new Error("推荐人不存在"))
    //   }
    // });

    callback(new Error("推荐人不存在"))
  }
}

formRef引用form对象

  • form表单中关联formRef(引用对象),form(表单内容),formRules(校验规则)
js 复制代码
<el-form ref="formRef" :model="form" :rules="formRules">
js 复制代码
const formRef = ref()

function reqLogin() {
  console.log("账号信息", form.value)
  formRef.value.validate((valid) => {
    console.log("formRef valid = ", valid)
    if (valid) {
      setToken()
      store.commit("setUserInfo", form.value)
      showToast("登录成功")
      router.push('/')
    }
  })
}

键盘监听

js 复制代码
onMounted(() => {
  console.log("页面加载")
  document.addEventListener('keyup', onkeyup)
})

onBeforeUnmount(() => {
  document.removeEventListener('keyup', onkeyup)
})

function onkeyup(e) {
  if (e.key === 'Enter') {
    reqLogin()
  }
}

完整代码

js 复制代码
<script setup>

import {onBeforeUnmount, onMounted, ref} from "vue";
import {Lock, User} from "@element-plus/icons-vue";
import {useRouter} from "vue-router";
import {setToken} from "../utils/CookieUtil.js";
import {showToast} from "../utils/ToastUtil.js";
import {useStore} from "vuex";

const router = useRouter()
const store = useStore()

const form = ref({
  userName: "",
  passWord: "",
  reference: ""
})

const formRef = ref()

const formRules = {
  userName: [{required: true, message: "用户名不能为空", trigger: 'blur'}, {
    min: 5,
    max: 10,
    message: "长度必须5-10位",
    trigger: 'blur'
  }],
  passWord: [{required: true, message: "密码不能为空", trigger: 'blur'}],
  reference: [{
    validator: referenceValidity,
    required: true,
    trigger: "blur",
  },],
}

function referenceValidity(rule, value, callback) {
  console.log('校验推荐人')
  if (value === "" || value === undefined) {
    callback(new Error("请输入推荐人姓名"));
  } else {
    //请求网络校验推广人
    // console.log("输入的推荐人姓名:" + value)
    // const _url = "xxxxxxxxxxx";
    // let param = {};
    // param.promotionPecialistName = value;
    // get(this.$http, _url, param).then(function (response) {
    //   let res = response.data;
    //   if (res.code === "I000000") {
    //     if (res.data.isFlag) {
    //       callback()
    //     } else {
    //       callback(new Error("推荐人不存在"))
    //     }
    //   } else {
    //     callback(new Error("推荐人不存在"))
    //   }
    // });

    callback(new Error("推荐人不存在"))
  }
}

function onkeyup(e) {
  if (e.key === 'Enter') {
    reqLogin()
  }
}

onMounted(() => {
  console.log("页面加载")
  document.addEventListener('keyup', onkeyup)
})

onBeforeUnmount(() => {
  document.removeEventListener('keyup', onkeyup)
})

function reqLogin() {
  console.log("账号信息", form.value)
  formRef.value.validate((valid) => {
    console.log("formRef valid = ", valid)
    if (valid) {
      setToken()
      store.commit("setUserInfo", form.value)
      showToast("登录成功")
      router.push('/')
    }
  })
}

</script>

<template>
  <div style="height: 100vh;width: 100vw;display: flex;flex-direction: row">

    <div class="flex-col-center" style="width: 70%;height: 100%;background: #213547;">
      <span style="font-size: 40px;color: white;">测试系统登录页面</span>
      <span style="font-size: 20px;color: white;">演示Demo</span>
    </div>

    <div class="flex-col-center" style="width: 30%;padding: 100px">
      <h2 style="font-size: 20px">欢迎回来</h2>
      <el-form ref="formRef" :model="form" :rules="formRules">
        <el-form-item label="账号" prop="userName">
          <el-input v-model="form.userName" placeholder="请输入账号">
            <template #prefix>
              <el-icon>
                <User/>
              </el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item label="密码" prop="passWord">
          <el-input v-model="form.passWord" placeholder="请输入密码" show-password type="password">
            <template #prefix>
              <el-icon>
                <Lock/>
              </el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item label="推荐人" prop="reference">
          <el-input v-model="form.reference" placeholder="请输入推荐人"></el-input>
        </el-form-item>
      </el-form>
      <el-button type="primary" @click="reqLogin()">登录</el-button>
    </div>

  </div>
</template>

<style scoped>

.flex-col-center {
  display: flex;
  flex-direction: column;
  justify-content: center
}

</style>
相关推荐
threerocks9 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
ly768911 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
剑胆琴心静水深流11 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
沙盘客12 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
默_笙14 小时前
👍 我的代码被 ESLint 抓包了:单引号、var、没分号——全被当场点名
前端·javascript
oh,huoyuyan14 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
汉堡大王952716 小时前
用 Trae Work 自动化任务,6 分钟生成一份前端生态周报
前端·javascript·人工智能
章鱼小丸子逃跑中16 小时前
【2025最新版】如何将fnm与node.js安装在D盘?【保姆级安装及人性话理解教程】
前端·javascript·npm·node.js
CAD老兵18 小时前
在浏览器里对比 DWG/DXF 图纸 —— @mlightcad/cad-diff-viewer
前端·javascript·github
WL_arm18 小时前
Vibe Coding(氛围编程)入门
javascript·css·人工智能·html5