越写悦快乐之Vue项目如何集成VeeValidate

VeeValidate仓库 - 图片来自我的手机

今天的越写悦快乐之系列文章为大家带来Vue项目如何集成VeeValidate。作为一名爱做梦的码农来说,不管是前端、后端、抑或是测试、运维,都需要保持一定的好奇心才可以,那么大家都知道Vue作为前端框架的集大成者,拥有着易用、灵活和高效的优点,那么对于在Vue项目中集成VeeValidate,大家有没有实践过呢?今天我为大家分享一下如何在Vue项目中集成VeeValidate。

VeeValidate是一看基于模板驱动的表单验证器,想了解相关内容,请参考官方文档
VeeValidate同时支持Vue 2和Vue 3

开发环境

  • Window 10.0.17763
  • Node 10.18.0
  • Visual Studio Code 1.48.2
  • Vue 2.6.12
  • Vee Validate 3.4.5
  • Vue CLI 4.5.9

接入步骤

创建项目

我们可以通过两种方式来创建项目:

1)命令行

  • vue create vee-validate-go(选择默认配置)

2)Vue UI

在命令行或者终端输入vue ui即可打开默认浏览器,然后选择项目存放位置、输入项目信息、包管理方式等信息,最后点击创建工程。

安装VeeValidate依赖

我们在终端下执行以下命令:

yarn add vee-validate@3.4.5 element-ui -S

编写验证规则文件

既然我们要验证表单的可用性,那么首先我们编写验证规则文件,相关写法可参考以下代码:

import { required, length, email } from "vee-validate/dist/rules";
import { extend } from "vee-validate";

extend("required", {
  ...required,
  message: "This field is required",
});

extend("email", {
  ...email,
  message: "This field must be a valid email",
});

extend("length", {
  ...length,
  message: "This field must have 2 options",
});

代码说明

  • 导入规则,扩展相关验证
  • 验证不通过渲染错误信息

编写表单页面

我们在about页面中添加如下内容:

<template>
  <div class="about">
    <ValidationObserver ref="observer" v-slot="{ handleSubmit }">
      <el-form ref="form" :model="form" label-width="80px">
        <ValidationProvider
          rules="required|email"
          name="Email"
          v-slot="{ errors }"
        >
          <el-form-item prop="email" :error="errors[0]" label="Email">
            <el-input v-model="form.email"></el-input>
          </el-form-item>
        </ValidationProvider>

        <ValidationProvider
          rules="required"
          name="Password"
          v-slot="{ errors }"
        >
          <el-form-item prop="password" :error="errors[0]" label="Password">
            <el-input type="password" v-model="form.password"></el-input>
          </el-form-item>
        </ValidationProvider>

        <ValidationProvider
          rules="required|length:2"
          name="Drinks"
          v-slot="{ errors }"
        >
          <el-form-item :error="errors[0]" label="Drinks">
            <el-checkbox-group v-model="form.choices">
              <el-checkbox label="Coffee"></el-checkbox>
              <el-checkbox label="Tea"></el-checkbox>
              <el-checkbox label="Soda"></el-checkbox>
            </el-checkbox-group>
          </el-form-item>
        </ValidationProvider>

        <el-form-item>
          <el-button type="primary" @click="handleSubmit(onSubmit('form'))"
            >Create</el-button
          >
          <el-button @click="resetForm">Reset</el-button>
        </el-form-item>
      </el-form>
    </ValidationObserver>
  </div>
</template>

<script>
import { ValidationObserver, ValidationProvider } from "vee-validate";

export default {
  name: "About",
  components: {
    ValidationObserver,
    ValidationProvider,
  },
  data: () => ({
    form: {
      email: "",
      password: "",
      choices: [],
    },
  }),
  methods: {
    onSubmit(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          console.log("valid", valid);
        } else {
          console.log("error submit");
          return false;
        }
      });
    },
    resetForm() {
      this.form.email = "";
      this.form.password = "";
      this.form.choices = [];
      this.$nextTick(() => {
        this.$refs.observer.reset();
      });
    },
  },
};
</script>

项目配置文件

当通过@vue/cli创建项目后,我们可以看到项目的配置文件如下:

{
  "name": "vee-validate-go",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "3.8.1",
    "element-ui": "2.14.1",
    "vee-validate": "3.4.5",
    "vue": "2.6.12",
    "vue-router": "3.4.9"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-vuex": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "vue-template-compiler": "^2.6.12"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

项目入口文件

我们在项目的入口main.js文件中可以看到ElementUI和验证脚本的引入,其内容如下:

import Vue from "vue";
import App from "./App.vue";
import router from "./router";

import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";

Vue.use(ElementUI);

import "./vee-validate";

Vue.config.productionTip = false;

new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app");

项目结构

当我们完成代码的编写后,可以看到项目的结构如下图所示:

项目结构 - 图片来自我的手机

查看结果

我们在项目所在的控制台(或者终端)执行yarn dev命令,然后通过Router跳转到about页面即可看到表单,点击创建按钮。

验证结果 - 图片来自我的手机

参考

个人收获及总结

本文介绍了如何在Vue项目中集成VeeValidate,它不同于Element UI内置的验证库async-validator,该表单验证器更方便地定制化验证规则,错误提示信息,监听表单的提交状态并通过ValidationProvider来slot错误信息,将用户的输入加以限制,避免不可预知的风险,我相信这不仅能防止用户误操作,也可以有效防范不法分子的攻击。我会持续提升Vue的开发效率和体验,让技术赋能我们的产品和服务,让我们一起创造美好的未来,构建适合自己的知识体系。若是我的文章对你有所启发,那将是我莫大的荣幸。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容