首页 > 其他分享 >数据对象校验原理

数据对象校验原理

时间:2023-06-29 16:22:05浏览次数:78  
标签:... normalizer 对象 校验 表单 rules 原理 data

表单数据校验

jquery-validation

The jQuery Validation Plugin provides drop-in validation for your existing forms, while making all kinds of customizations to fit your application really easy.

来自jquery-validation
项目。大概就是提供嵌入式的方式去校验表单,灵活、便捷。

<form>
    <input required>
</form>
<script src="jquery.js"></script>
<script src="jquery.validate.js"></script>
<script>
    $("form").validate();
</script>

看下使用说明,确实十分方便。但是核心的问题是jq的逻辑基于页面而非js对象。在vdom的洪流中,这种校验方式注定需要被进一步剥离出来。

jquery-validation核心逻辑在#L748

check: function( element ) {
	...
	// 1 获取rules对象 {normalizer: function, f1: p1, f2: p2 ...}
	var rules = $( element ).rules();
	...
	// 2 获取表单获取函数
	if ( typeof rules.normalizer === "function" ) {
		normalizer = rules.normalizer; // 2.1 自定义表单获取函数
	} else if (	typeof this.settings.normalizer === "function" ) {
		normalizer = this.settings.normalizer; // 2.2 通用表单获取函数
	}
	...
	// 3 获取表单value
	val = normalizer.call( element, val );
	delete rules.normalizer
	...
	// 4 遍历rules对象 {f1: p1, f2: p2 ...}
	for ( method in rules ) {
		rule = { method: method, parameters: rules[ method ] };
		result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
	}
}

拆解后就很明显了,共分成4步。

其中第2步和第3步不是非必须的。

第4步中rules和rule近名反意可以换成两个词,这里的校验即提供了列表校验,也提供了自定义校验,这就存在自定义校验是可以包括列表校验的这层关系,列表校验增加了复杂性但是带来的收益不大甚至可以被自定义校验取代。

当然这里也可以学习到一些对象处理技巧,如delete的操作。

数据对象校验

近些年虚拟DOM火起来了无论是diff算法,还是渲染跨平台的能力都预示着未来可能是vDOM的世界。

基于表单数据的校验方式就要被改造成基于表单背后的数据对象的校验方式。结合上面的分析来实现一个轻量灵活的数据对象校验器。

首要考量就是业务中的空如何定义,以js为例子。

  • ''是空么?
  • 0是空么?
  • false是空么?
  • undefined是空么?
  • null是空么?
  • []是空么?
  • {}是空么?

我这里的结论是''undefinednull属于空,其他属于空值。

空值合并运算符,它是ES2020的一个新特性,它的作用是当一个表达式是undefinednull 时为变量设置一个默认值。空值合并运算符在左侧的值是 null 或 undefined 时会返回问号右边的表达式。

很方便可以使用(data ?? '') === ''这种方式来判空,而不会受到空值影响,非常巧妙。

function required(data, value) {
	return (data ?? '') === '' ? ((false ^ value) === 0) : true
},

规则校验要比表单校验更加简单,核心代码很少,也不涉及任何依赖。

function validate(data, rules) {
	for (const key in data)
		if (!validdy.validators[Object.keys(rules[key])[0]](data[key], Object.values(rules[key])[0]))
			return { ok: false, msg }
	return { ok: true, msg: '' }
},

参数解释如下。

// data 数据对象
const data = {
	name: '',
	plans: [],
}

// rules 校验规则
const rules = {
	name: {
		required: true,
		msg: '请填写姓名',
	},
	plans: {
		lenlimit: {min: 1, max: 10},
		msg: '最少包含一个基础套餐最多包含十个套餐',
	},
}

// validators['contains'] 定义校验函数 true为通过
validators['lenlimit'] = (data, value) => validators['lenmin'](data, value.min) && validators['lenmax'](data, value.max)


// validated 校验结果
const validated = validate(data, rules)
if (!validated.ok) { // 失败逻辑
	return
}
// 通过逻辑

数据对象校验源码已经开源到validdy,js实现,其他语言有兴趣自行了解下。

标签:...,normalizer,对象,校验,表单,rules,原理,data
From: https://www.cnblogs.com/neennocc/p/data-validate.html

相关文章

  • 面向对象程序编程PTA题目集4、5以及期中考试的总结性Blog
    1.对之前发布的PTA题目集4、5以及期中考试的总结性Blog,内容要求如下:(1)前言:总结之前所涉及到的知识点、题量、难度等情况期中考试作业:知识点:主要就是考了对类的使用,和不同类间的相互配合使用,还有对于一个程序的不断循环使用(相比之前更加灵活,可以自定义输入的个数),正则表达(可用可不......
  • 面向对象(三大特征、继承下的查找、super、组合)
    面向对象有三大特征:封装、继承和多态继承继承其实和封装差不多,就是新建的类称为是子类或派生类,多个子类继承同一个类,这个类教父类或基类1.为什么要继承类解决什么问题:解决的是对象与对象之间代码冗余问题继承解决什么问题:解决的是类与类之间的代码冗余问题2.怎样继......
  • 面向对象的高级原则
    1、开放/封闭原则模块应该对扩展开放,对修改关闭。每个类型应该是固定的,不在未来有任何变化,更不要修改类型的源代码。即类型对修改关闭。每次发生变化时,要通过添加新代码来增强现有类的行为,而不是修改原有代码。可以使用如下两种方式:①用组合创建新的类型。②使用安全干净的继......
  • 宏观经济学原理
    GDP的概念在某一既定时期一个国家内生产的所有最终物品与服务的市场价值。GDP=消费+投资+政府购买+净出口净出口外国对国内生产的物品的支出(出口)减国内对外国物品的支出(进口)GDP增多生产了更多的物品与服务以更高的价格销售物品与服务名义、真实GDP名义GDP:按现期价格评......
  • Iterator和LlistIterator迭代器的使用及底层原理:
    先来看下面的示例:publicclassDemo{publicstaticvoidmain(String[]args)throwsIOException{List<String>list=newLinkedList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒")......
  • Java中获取request对象的几种方法
    1.通过注解获取(很简单,推荐):publicclassHello{@AutowiredHttpServletRequestrequest;//这里可以获取到request} 2.在web.xml中配置一个监听:<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></liste......
  • Java流程控制——Scanner对象
    Scanner对象java.until.Scanner是Java5的新特性,可以通过Scanner类来获取用户的输入,实现计算机与人的交互。基础语法:Scanners=newScanner(System.in);通过Scanner类的next()与nextLine()方法获取输入的字符串在读取之前一般需要使用hasNext()和hasNextLine()判断是否还有输......
  • synchronized中wait、notify的原理与源码
    synchronized中wait、notify的原理与源码1.wait和notify的流程图2.JVM源码java层面wait的方法publicfinalnativevoidwait(longtimeout)throwsInterruptedException;jvm中object.cstaticJNINativeMethodmethods[]={{"hashCode","()I",......
  • Pod的创建过程原理
    Pod的创建过程原理 首先,用户通过kubectl或web端向APIServer发送创建pod的请求;APIServer会做出认证/鉴权响应,然后检查信息并把数据存储到ETCD里,创建Deployment资源并初始化;controller-manager通过list-watch机制,检查发现新到Deployment,将资源加入到内部工作队列,然后检查发现......
  • is620n,is620p,is620,伺服驱动器的代码和原理等
    is620n,is620p,is620,伺服驱动器的代码和原理等原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/662030618032.html......