Vue基于JSON Schema生成表单和数据校验
基于 Vue.js
、JSON Schema
和 ElementUi
快速生成表单,支持自定义组件,支持自定义错误提示配置和校验规则...
生成表单如下图:
JSON Schema 是什么
JSON Schema
定义了一套规范用于描述你的数据格式,包含对数据结构的描述和约束等。各种开发语言都有相应的类库实现对schema的校验支持。
一个 JSON Schema
的例子:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": [
"userName"
],
"properties": {
"userName": {
"type": "string",
"title": "UserName",
"default": "Name"
},
"age": {
"type": "integer",
"title": "Age",
"maximum": 80,
"minimum": 16
},
"bio": {
"type": "string",
"title": "Bio",
"minLength": 10
}
},
"additionalProperties": false
}
如上 schema
描述了一个 object
- 包含
userName
、age
、bio
三个属性 userName
为string
类型且必须定义age
为integer
类型且在16
到80
之间bio
为不小于10
个长度的string
√ 正确的例子
{
userName: 'name',
age: 18
}
× 错误的例子 - (bio
长度不小于10个)
{
userName: 'name',
age: 18,
bio: '嘿嘿嘿'
}
了解更多可以查看JSON Schema官方文档:https://json-schema.org/under...
JSON Schema的表单生成
通过 JSON Schema
生成form表单,数据校验校验基于 ajv
,只需要一个必须的 schema
参数即可生成完整可校验的form表单。
- JSON Schema
title
属性作为 form表单的标题 - JSON Schema
description
属性作为表单的描述 - 可通过
uiSchema
配置个性化的视图显示,也可以直接配置在JSON Schema
中 - 可通过
errorSchema
配置表单校验错误文案,也可以直接配置在JSON Schema
或者uiSchema
中 - 支持多语言
- 支持自定义组件,自定义样式
- ...
详细的可以查看上方 github 链接
表单渲染流程大致如下图,基于组件递归的形式,逐级渲染
一个简单的用户信息录入例子:
<template>
<vue-form
v-model="formData"
:schema="schema"
>
</vue-form>
</template>
<script>
import VueForm from '@lljj/vue-json-schema-form';
export default {
name: 'Demo',
components: {
VueForm
},
data() {
return {
formData: {},
schema: {
type: 'object',
required: [
'userName',
'age',
],
properties: {
userName: {
type: 'string',
title: '用户名',
default: 'Liu.Jun',
},
age: {
type: 'number',
title: '年龄'
}
}
}
};
}
};
</script>
即可生成如下表单:
JSON Schema表单所解决的问题
遵循 JSON Schema
规范,可以很方便的做到跨端数据校验,这在处理一些前端可视化编辑的场景是非常有用的。
比如:
- 在我们做一个可视化的活动编辑页时,当你在新增一个活动版块时,需要
板块配置信息录入
、板块预览组件
、服务端配合做数据校验
这三个部分。- 开发者重点关注
模块预览组件
也就是新增的模块长什么样,这里使用JSON Schema
生成表单可以很好的解决板块配置信息录入
、服务端配合做数据校验
这两个问题。- 新增版块定义好
JSON Schema
数据即可生成配置表单,同时把JSON Schema
给到后端系统即可做到服务端数据校验(这一步可以在构建或者发布流程环节来推给后端)
最后
开发这个的目的是为了做一套可视化店铺装修系统,在考虑对页面数据配置和校验过于繁琐如何简化时所采用的方案,但并未找到太合适的开源库,所以就自己写了一个。
另外我在 github 项目仓库中包含了一个开箱即用的店铺装修可视化编辑的展示页,演示效果:vue-json-schema-form店铺装修编辑器
欢迎star或提出建议
推荐阅读
结合 lerna 和 yarn workspace 管理多项目工作流
名词解释多个项目的代码放在在同一存储库中这种开发策略称之为 Monorepolerna Babel开发用来管理多包的工具,基于 Monorepo 理念在工具端的实现yarn Facebook 贡献的 Javascript 包管理器commitlint 用来规范git ...
lljj_x赞 17阅读 12.1k评论 1
从零搭建 Node.js 企业级 Web 服务器(零):静态服务
过去 5 年,我前后在菜鸟网络和蚂蚁金服做开发工作,一方面支撑业务团队开发各类业务系统,另一方面在自己的技术团队做基础技术建设。期间借着 Node.js 的锋芒做了不少 Web 系统,有的至今生气蓬勃、有的早已夭折...
乌柏木赞 140阅读 11.9k评论 10
从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...
乌柏木赞 60阅读 5.9k评论 16
再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...
libinfs赞 39阅读 6.1k评论 12
从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...
乌柏木赞 39阅读 7.1k评论 6
CSS 绘制一只思否猫
欢迎关注我的公众号:前端侦探练习 CSS 有一个比较有趣的方式,就是发挥想象,绘制各式各样的图案,比如来绘制一只思否猫?思否猫,SegmentFault 思否的吉祥物,是一只独一无二、特立独行、热爱自由的(>^ω^<...
XboxYan赞 41阅读 2.8k评论 14
还在用 JS 做节流吗?CSS 也可以防止按钮重复点击
举个例子:一个保存按钮,为了避免重复提交或者服务器考虑,往往需要对点击行为做一定的限制,比如只允许每300ms提交一次,这时候我想大部分同学都会到网上直接拷贝一段throttle函数,或者直接引用lodash工具库
XboxYan赞 34阅读 2.2k评论 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。