{"id":26075824,"url":"https://github.com/zhipenglin/form","last_synced_at":"2026-04-19T17:37:07.335Z","repository":{"id":215598873,"uuid":"89986240","full_name":"zhipenglin/form","owner":"zhipenglin","description":"一个form校验框架","archived":false,"fork":false,"pushed_at":"2017-05-11T03:48:59.000Z","size":109,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-18T09:20:54.828Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhipenglin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-05-02T03:09:22.000Z","updated_at":"2019-04-02T02:55:03.000Z","dependencies_parsed_at":"2024-01-05T11:45:29.034Z","dependency_job_id":"9f096859-a758-4081-8d20-711b22a3fc43","html_url":"https://github.com/zhipenglin/form","commit_stats":null,"previous_names":["zhipenglin/form"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhipenglin%2Fform","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhipenglin%2Fform/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhipenglin%2Fform/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhipenglin%2Fform/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhipenglin","download_url":"https://codeload.github.com/zhipenglin/form/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242627335,"owners_count":20160262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-09T01:06:29.483Z","updated_at":"2025-12-05T05:05:29.340Z","avatar_url":"https://github.com/zhipenglin.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Form\n\n[详细文档](https://zhipenglin.github.io/form/docs)\n\n## 特性\n* UI逻辑与验证逻辑完全分离，UI逻辑可以根据需求灵活定制，可以进行jquery，react等多种UI框架或场景的适配\n* 验证逻辑的全测试用例，确保安全稳定\n* 功能强大，提供了一套，动态的，异步的校验机制，通过hashCode标记每一次校验的缓存，保证了相同条件的校验只被执行一次，提高性能。\n\n## 校验机制\n每个字段依次进行以下4部校验：\n1. 必须性校验\n2. 长度校验\n3. 类型校验\n4. 自定义校验（一般用于异步远程校验）\n校验完成后返回一个Promise对象，可以在校验完成后取得校验结果对象:\n```js\n{status:是否通过校验,msg:错误字符串模版,value:字段当前值,name:字段名称}\n```\n\n## 验证表达式\n通过一个有规则的字符串解析出一组校验规则，验证表达式一般包含以下几个部分\n* req 表达式中包含它，说明需要进行必须性校验\n* {number}-{number} 表达是包含它说明需要进行长度校验，它一般有三种形式，例如：1-20表示允许1-20个字符 0-20表示必须小于20字符 20表示必须大于20字符\n* {type} 表达式中包含它，说明需要进行类型校验，{type}必须可以在默认rules或者用户参数传入的rules里找到，可以有多个，任意一个规则失败会导致类型校验失败\n\n下面举几个例子说明：\n1. 'req 5-10 email' 该表达式表示：该字段必填，允许5-10个字符，格式必须为email\n2. 'tel' 该表达式表示：该字段不必填，格式必须为tel（手机号）\n3. 'req 6 pwd' 该表达式表示：该字段必填，必须大于等于6个字符，格式必须为pwd\n\n## 自定义校验\n自定义校验通过use方法追加，在某一字段进行完表达式验证并且通过之后，如果发现有追加的自定义校验方法，则按照追加顺序依次开始执行自定义校验。\n同一字段可以追加多个自定义校验，他们并行执行，当某一个方法返回结果不通过，则立即返回结果对象，当所有方法全部通过，返回结果对象\n\n下面举例说明：\n```js\nform.use('user_name',function(value,callback){\n    setTimeout(function(){\n        if(value.indexOf('123').length\u003e-1){\n            callback(true);\n        }else{\n            callback({status:false,msg:'用户名未注册'});\n        }\n    },1000);\n}).use('user_name',function(value,callback){\n    setTimeout(function(){\n        if(value.indexOf('56').length\u003e-1){\n            callback(true);\n        }else{\n            callback({status:false,msg:'用户名不合法'});\n        }\n    },50);\n});\n```\n以上例子将对user_name字段执行两次校验，如果value为1234，则50ms后返回{status:false,value:'1234',name:'user_name',msg:'用户名不合法'}结果。\n\n如果value为4567则1000ms后返回{status:false,value:'1234',name:'user_name',msg:'用户名未注册'}结果。\n\n如果value为1234567则1000ms后返回{status:true,value:'1234',name:'user_name'}结果\n\n## 缓存\n每次执行完校验的结果都会通过（字段名，值，验证表达式）计算出一个hashCode，当且仅当hashCode相等时（即字段名，值，验证表达式完全相等）直接返回缓存中的校验结果\n\n可以通过clearFieldCache clearAllCache方法来删除已有缓存\n\n## 事件\n可以通过on方法进行事件绑定，传入name则表示只监听name字段触发的事件，不传入name则表示监听所有字段触发的事件\n\neventName有以下几种\n1. pass 校验完成并且通过触发该事件\n2. loading 开始执行用户自定义校验触发该事件\n3. error 校验完成且不通过触发该事件","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhipenglin%2Fform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhipenglin%2Fform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhipenglin%2Fform/lists"}