Vue基于JSON Schema生成表单和数据校验

赵嬷嬷
• 阅读 8117

基于 Vue.jsJSON SchemaElementUi 快速生成表单,支持自定义组件,支持自定义错误提示配置和校验规则...

生成表单如下图:
Vue基于JSON Schema生成表单和数据校验

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

  • 包含 userNameagebio 三个属性
  • userNamestring 类型且必须定义
  • ageinteger 类型且在 1680 之间
  • 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 链接

表单渲染流程大致如下图,基于组件递归的形式,逐级渲染

Vue基于JSON Schema生成表单和数据校验

一个简单的用户信息录入例子:

<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>

即可生成如下表单:
Vue基于JSON Schema生成表单和数据校验

JSON Schema表单所解决的问题

遵循 JSON Schema 规范,可以很方便的做到跨端数据校验,这在处理一些前端可视化编辑的场景是非常有用的。

比如:

  1. 在我们做一个可视化的活动编辑页时,当你在新增一个活动版块时,需要 板块配置信息录入板块预览组件服务端配合做数据校验 这三个部分。
  2. 开发者重点关注 模块预览组件 也就是新增的模块长什么样,这里使用 JSON Schema 生成表单可以很好的解决 板块配置信息录入服务端配合做数据校验 这两个问题。
  3. 新增版块定义好 JSON Schema 数据即可生成配置表单,同时把 JSON Schema 给到后端系统即可做到服务端数据校验(这一步可以在构建或者发布流程环节来推给后端)

最后

开发这个的目的是为了做一套可视化店铺装修系统,在考虑对页面数据配置和校验过于繁琐如何简化时所采用的方案,但并未找到太合适的开源库,所以就自己写了一个。

另外我在 github 项目仓库中包含了一个开箱即用的店铺装修可视化编辑的展示页,演示效果:vue-json-schema-form店铺装修编辑器

欢迎star或提出建议

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这