vue里面编写数据校验插件

101 阅读1分钟

整个过程如下

首先,在跟组件里面定义一个规则(这个规则是自定义属性)rules={},规则里面包含用来校验输入的变量,这里是姓名和年龄,如果不符合规则,就返回定义的错误消息。注意:在vue中,所有定义的属性,都可以用$options获取到。

定义一个全局混入mixin,里面写生命周期函数mounted(){},(意思是挂载完成之后自动执行),使用mounted函数的属性,就可以在mounted里面遍历定义好的校验规则。同时,在mounted函数里面使用this.watch来监听,当数据发生变化,就把最新的值传到自定义的规则里面去。

在vue中,因为所有的内容都可以写入插件里面去,所有,定义好规则,定义好混入之后,把这些内容都复制放到vue的插件里面去。

在vue中使用这个组件即可。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>
  <body>
    <div id="root"></div>
  </body>
  <script>
    // 定义一个插件,所有的内容都可以写到插件里面去
    const validatePlugin = {
      install(app, options) {
        // 所有的内容都写到插件的install里面,包括混入mixin也写到插件里面去
        // 定义一个全局混入mixin
        app.mixin({
          // 用生命周期函数mounted,挂载之后自动执行
          //
          mounted() {
            // vue中定义的所有的属性都在$options里面,包括rules
            // 用for in 遍历定义好的规则 key意思是规则里面的第几项
            for (const key in this.$options.rules) {
              // 用item来接收里面的各个规则
              const item = this.$options.rules[key];
              //   使用$watch来监控数据的变化
              //   数据改变会触发校验,如果不符合规则,就返回定义的message
              this.$watch(key, (value) => {
                // value可以获取最新的值,传到校验规则里面的函数中去
                const result = item.validate(value);
                // 如果没有通过,(result取反),那么返回消息
                if (!result) {
                  console.log(item.message);
                }
              });
            }
          },
        });
      },
    };
    // 定义根组件
    const app = Vue.createApp({
      // 定义一个变量
      data() {
        return {
          name: "zhangsan",
          age: 18,
        };
      },
      //  自定义属性,里面包含了校验规则(函数),以及不通过的时候返回的消息
      //   这个rules是自定义的属性,vue里面自定义的属性都写到了$options里面去了
      rules: {
        age: {
          // 校验规则是age要大于25.不然就返回“太年轻了”
          validate: (age) => {
            return age > 25;
          },
          message: "太年轻了",
        },
        // 也可以校验name
        name: {
          // 校验规则是name长度要小于5,不然姓名输入错误
          validate: (name) => {
            return name.length < 5;
          },
          message: "姓名格式输入错误",
        },
      },
      //   模板
      template: `<div>
				用户名: {{name}}, 年龄: {{age}}
			</div>`,
    });
    // 使用定义好的插件
    app.use(validatePlugin);
    // 把跟组件挂载到div里面
    const vm = app.mount("#root");
  </script>
</html>