zoukankan      html  css  js  c++  java
  • 使用 vue watch 与自定义 css 模仿 Vuelidate 框架官方表单验证效果(表单验证小案例)

    前端表单验证交互

    效果1(暂未配套代码)

    使用 vue watch 与自定义 css 模仿 Vuelidate 框架官方表单验证效果

    关键思路:(看了代码就能结合起来了)

    • 动态监听输入内容的改变,动态校验其数据的合法性
    • 不合法,给元素添加 class,该 class 给 label、input 标签修改样式,并附带动画,并显示错误信息
    • 合法了,移除该 class,恢复默认样式,隐藏错误信息

    如何在显示错误信息与不显示错误信息时不移动其他页面元素

    • 没有信息时,输入框 margin-bottom 2rem
    • 有错误信息时,边框 margin-bottom 0rem,错误信息margin-bottom 2rem

    代码(仅做思路参考)

    里面还是有些冗余样式代码

    • 其实 input 的 onchange 事件也可以做这么一件事

    • 数据符合格式的展示样式 css 被我注释掉了

    • css 代码里的重要的是不同情况下的颜色变化(文字、边框)、动画(输入框晃动)(字体大小、之类的不重要)

    <template>
      <div class="fatherDiv">
        <div
          class="form-group"
          :class="{ 'form-group--error': showErr, 'form-group--success': dataOk }"
        >
          <label class="form__label">姓名</label>
          <input class="form__input" v-model="inputData" placeholder="请输入姓名..." />
        </div>
        <div class="error" v-if="showErr">{{dataErrMsg}}</div>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          showErr: false,
          inputData: "",
          dataOk: false,
          dataErrMsg: "",
        };
      },
      watch: {
        inputData: function (val, oldVal) {
          console.log("new: %s, old: %s", val, oldVal);
    
          // 在这里做一个数据的校验
          if (val.length > 5) {
            this.showErr = true;
            this.dataOk = false;
            this.dataErrMsg = "最多支持4个字符哦~";
          } else if (val.length < 1) {
            this.showErr = true;
            this.dataOk = false;
            this.dataErrMsg = "此字段为必填字段,请输入...";
          } else {
            this.showErr = false;
            this.dataOk = true;
          }
        },
      },
    };
    </script>
    
    <style scoped>
    .fatherDiv {
      text-align: start;
       300px;
      margin: 0 auto;
    }
    
    /* --------- 默认状态 ----------- */
    .form__label {
      font-size: 0.8125rem;
      color: #4b6372;
      margin-bottom: 0.3125rem;
      margin-left: 0.875rem;
      display: block;
      font-family: "Lato", sans-serif;
    }
    .form-group .form__input {
      margin-bottom: 0;
    }
    .form__input {
      font-family: "Lato", sans-serif;
      font-size: 0.875rem;
      font-weight: 300;
      color: #374853;
      line-height: 2.375rem;
      min-height: 2.375rem;
      position: relative;
      border: 1px solid #e8e8e8;
      border-radius: 5px;
      background: #fff;
      padding: 0 0.8125rem;
       100%;
      transition: border 0.1s ease;
      box-sizing: border-box;
      outline: none;
    }
    
    /* 鼠标悬浮,输入框边框变色 */
    .form__input:hover {
      border-color: #cfcfcf;
    }
    
    /* ----------- 错误相关样式 -------- */
    .form-group--error {
      animation-name: shakeError;
      animation-fill-mode: forwards;
      animation-duration: 0.6s;
      animation-timing-function: ease-in-out;
    }
    @keyframes shakeError {
      0% {
        transform: translateX(0);
      }
      15% {
        transform: translateX(0.375rem);
      }
      30% {
        transform: translateX(-0.375rem);
      }
      45% {
        transform: translateX(0.375rem);
      }
      60% {
        transform: translateX(-0.375rem);
      }
      75% {
        transform: translateX(0.375rem);
      }
      90% {
        transform: translateX(-0.375rem);
      }
      100% {
        transform: translateX(0);
      }
    }
    .form-group--error .form__label,
    .form-group--error .form__label--inline {
      color: #f04124;
    }
    
    .form-group--error + .error {
      color: #f57f6c;
    }
    
    .form-group--error input,
    .form-group--error input:focus,
    .form-group--error input:hover {
      border-color: #f79483;
      /* 隐藏浏览器的聚焦边框效果 */
      outline: none;
    }
    
    /* 正确样式-数据符合格式的样式,个人认为可以不设置 */
    .form-group--success .form__label,
    .form-group--success .form__label--inline {
      color: #2eec96;
    }
    
    .form-group--success input,
    .form-group--success input:hover {
      border-color: #2eec96;
      outline: none;
    }
    
    /* .form-group--success input:focus {
      border-color: #cfcfcf;
    } */
    </style>
    

    关于数据校验

    简单的自己校验,如果项目中有许多需要校验的字段,一般借助第三方框架去做

    第三方框架有很多,暂时还没去系统学习,下面留个链接与相关博客

    Vuelidate

    validator.js

    • 官网

    • element-ui 内置的验证框架,似乎很强

    VeeValidate

    VccValidate

    • 没怎么了解,中文文档
    • 2019/4/24的项目,star 不多,但近期都在更新(2020/7/29,现在 2020/8/29)

    补充知识

    H5自带的表单验证

    • 原生表单验证也有几个 css 伪类可以控制样式,但不同浏览器效果可能不同,也有兼容性问题,还是推荐上面 demo 中的写法

    美化表单的CSS高级技巧(第一张效果图来源,挺不错的,可惜是原生校验方式)

    JS 自定义表单验证

  • 相关阅读:
    《AI for Game Developers》第七章 A*路径寻找算法 (二)(skiplow翻译)
    芯片科普学习笔记
    sprboot 配置logback 日志输出
    springboot+mybatis 配置双数据源(mysql,oracle,sqlserver,db2)
    vue 封装axios请求
    *arg参数
    pytest mac安装了pytest,但是输入pytest却提示命令不存在
    构建Java Web开发环境
    在CentOS上编译安装PostgreSQL
    在Ubuntu 14.04上使用Eclipse开发和调试PosgreSQL9.3.4
  • 原文地址:https://www.cnblogs.com/suwanbin/p/13583635.html
Copyright © 2011-2022 走看看