满口金牙 2022-12-14 22:13 采纳率: 91.5%
浏览 69
已结题

Vue 通用 表单验证器

不想用插件,用插件的好处是简单,方便谈不上,有时要定制就很麻烦,不好改
所以琢磨着写一个通用的 表单验证器
请教一下 vue 通用表单验证器的一般写法

最好有个例子,我可以参考一下

  • 写回答

4条回答 默认 最新

  • CSDN专家-showbo 2022-12-14 22:40
    关注
    
    <script src="https://unpkg.com/vue@next" data-v="3"></script>
    <style>
        .invalid{border-color:#f00}
    </style>
    <div id="app">
        <form v-formsubmit>
            <input v-required placeholder="不能为空" />
            <input v-regex data-regex="^\d+(\.\d+)?$" placeholder="只能填写数字" />
            <button @click="save" ref="btn">保存</button>
        </form>
    </div>
    <script>
        var config = {
            methods: {
                save() {
                    setTimeout(() => {//需要延时下,click执行先于form绑定的submit事件
                        var valid = !this.$refs.btn.form.classList.contains('invalid')
                        console.log(valid)
                    }, 0)
    
                }
            }
        };
        var app = Vue.createApp(config);
        app.directive('formsubmit', {//表单指令
            mounted(el) {
                el.addEventListener('submit', function (e) {
                    e.preventDefault();//阻止表单提交
                    var form = this;
                    var error = false;
                    var els = Array.from(form.querySelectorAll('.validate'));
                    if (els.filter(i => i.classList.contains('invalid')).length) {//存在不通过的验证
                        form.classList.add('invalid');
                        return false;
                    }
    
                    //什么操作都没有,直接点击保存,触发下原生dom事件执行验证
                    for (var el of els) {
                        for (var attr in el.dataset) {
                            var arr = attr.split('_');
                            if (!['HTMLEvents', 'MouseEvents'].includes(arr[0])) continue;
                            var event = document.createEvent(arr[0]);
                            event.initEvent(arr[1], true, false);
                            el.dispatchEvent(event);
                            if (el.classList.contains('invalid')) {
                                form.classList.add('invalid');
                                error = true;
                            }
                        }
                    }
    
                    if (!error)//全部验证通过,移除样式
                        form.classList.remove('invalid');
    
                });
            }
        });
        app.directive('required', {//必须填写数据指令
            mounted: function (el) {
                el.classList.add('validate');//添加过指令,给控件添加validate样式
                el.dataset.HTMLEvents_blur = true;//添加绑定事件,注意驼峰写法,以便表单验证时触发(HTMLEvents或者MouseEvents+_事件名【注意小写】)
                el.addEventListener('blur', () => {
                    if (el.value.trim() == '') {
                        el.classList.add('invalid')
                    }
                    else el.classList.remove('invalid')
                })
            }
        });
        app.directive('regex', {//正则指令
            mounted: function (el) {
                el.classList.add('validate');//添加过指令,给控件添加validate样式
                el.dataset.HTMLEvents_blur = true;//添加绑定事件,注意驼峰写法,以便表单验证时触发(HTMLEvents或者MouseEvents+_事件名【注意小写】)
                var re = new RegExp(el.dataset.regex);
                el.addEventListener('blur', () => {
                    if (!re.test(el.value)) {
                        el.classList.add('invalid')
                    }
                    else el.classList.remove('invalid')
                })
            }
        });
        app.mount('#app')
    </script>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月14日

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站