npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

schema-render-form

v0.0.2

Published

根据JSON Schema中声明的属性渲染表单组件

Downloads

7

Readme

表单(渲染)组件 -- schema-render-form

schema-render-form 是基于 Vue 高阶渲染函数Element-ui 开发的Form表单组件。

Form表单作为用户与网站间获取、传递数据的载体,应用场景广,灵活度高,是网页交互的核心元素。SchemaForm表单组件提供了一种高效的Form表单开发方式。使用时,通过 JSON Schema 对象设置各表单子项的渲染参数,易于编写,复用性高,利于提升开发效率。

目录

安装模块

使用前,在命令行运行以下命令,将本项目安装至开发环境依赖。

npm install -S schema-render-form 

使用SchemaForm

SchemaForm为一个element-ui模板表单组件,支持内嵌常见的、用于数据输入、提交及展示的基础组件。根据所声明的JSON Schema对象,将自动判断各表单子项对应的组件模板,并渲染表单。

引入方式

import { SchemaForm } from 'schema-render-form';      

参数说明

声明组件表单的JSON Schema对象应包括基础参数propertiestype

  • properties: 组件表单属性,包含声明各子项组件的schema对象,参数类型为对象
  • type: 组件表单的schema类型,参数类型为字符串,默认为'object'
schema: {
  properties: {
    obj1: {
      ...
    },
    ...
  },
  type: 'object'
}

表单内各子项组件的配置声明均采用JSON Schema格式,默认的JSON Schema格式为:

obj: {
  type: '', // ···················· 字段类型(必须)
  title: '', // ··················· 字段标题
  titleHref: '', // ··············· 标题链接
  toolTip: '', // ················· 标题文字提示
  description: '', // ············· 字段描述
  default: '', // ················· 字段默认值
  required: true, // ·············· 字段是否必须
  format: '', // ·················· 字段格式
  attrs: {} // ···················· 字段其他属性
}

字段标题

obj: {
  title: '',
  [titleHref: 'sampleLink.com',]
  ...
}

在表单子项的schema对象中,通过声明title 字段,定义组件标题文本,参数类型为字符串;

标题链接

表单子项元素的标题支持插入链接; 若声明了titleHref 可选参数,且参数值为有效的目标页面链接,相应项的标题将渲染成文字链接,点击标题时新建分页打开目标页面。

必填项标识

obj: {
  required: true,
  ...
}

表单组件支持设置必填项,渲染时,必填项的标题左上方将自动添加红色星号标识; 若在子项组件的schema对象中声明了required字段,且参数值为true,则识别为必填项。

文字提示

obj: {
  title: '',
  toolTip: '',
  ...
}

表单子项元素支持插入toolTip进行文字提示/补充说明;若在子项组件的schema对象中声明了toolTip字段,且参数值为提示文本内容,则在组件标题的右侧渲染问号图标,鼠标移动至图标上方时显示文字提示。

  • 文字提示的默认主题为dark,默认显示方位为图标正上方。
  • 文字提示图标默认在标题右侧渲染,因此只有声明了组件标题时有效。

应用例子:

icon: {
    title: '插入图标',
    titleHref: 'https://element.eleme.cn/#/zh-CN/component/icon',
    toolTip: '点击标题浏览所支持的图标类名',
    type: 'string',
    description: '请输入element-ui图标类名',
  },

字段标题渲染效果:

image

鼠标移至问号图标上方效果:

image

点击表单标题时将会新建分页打开element-ui-图标的说明页面。

表单示例

  • 渲染一个包含输入框、下拉选择框、数字选择框的基础个人信息表单,其中,姓名为必填项:
<template>
  <schema-form :schema="schema"></schema-form>
</template>

<script>      
import { SchemaForm } from 'schema-render-form';   

export default {
  name: 'personal-info',
  components: { SchemaForm },
  data() {
    return {
      // 用JSON Schema形式声明表单包含的组件
      schema: {
        properties: {
          name: {
            title: '名字', // 设置组件标签为'名字'
            type: 'string', // 渲染结果为输入框    
            required: true, // 设置为必填项,渲染时会标记红点
          },
          gender: {
            title: '性别', // 设置组件标签为'性别'
            type: 'string',
            // 渲染结果为下拉选择框
            enum: [
              { value: 'male', label: '男' },
              { value: 'female', label: '女' }
            ],
          },
          age: {
            title: '年龄', // 设置组件标签为'年龄'
            type: 'number', // 渲染结果为数字输入框
          }
        },
        type: 'object'
      }
    };
  },
};
</script>
  • 表单渲染效果:

image

组件对象及schema参数条件

SchemaForm表单支持的子项字段类型包括:

  • checkBox 多选框
  • radio 单选框
  • color 颜色选择器
  • datePicker 时间选择器
  • Text 文本/文字链接
  • input 文字输入框/文本域
  • inputNumber 数字输入框
  • select 下拉选择框
  • switch 开关
  • objectArray 对象数组

在构建表单时,将根据properties 参数中各子项的JSON Schema对象判断并渲染相应类型的组件。

对于不同类型的组件对象,需在相应的JSON Schema对象中定义以下参数值:

CheckBox 多选框

type: 'string',
anyOf:[{ value: '', label: '' }]

若组件JSON Schema对象中声明了类型字段type 的值为'string',且定义了anyOf字段,参数类型为对象数组,则渲染多选框。数组中各对象的'value''label'值分别对应各选项的选项值与选项标签。

Radio 单选框

type: 'string',
oneOf:[{ value: '', label: '' }]

若组件JSON Schema对象中声明了类型字段type 的值为'string',且定义了oneOf: 字段,参数类型为对象数组,则渲染单选框选项。数组中各对象的'value''label'值分别对应各选项的选项值与选项标签。

Select 下拉选择框

type: 'string',
enum: [{ value: '', label: '' }]

若组件JSON Schema对象中声明了类型字段type 的值为'string',且定义了enum字段,参数类型为对象数组,则渲染下拉选择框。数组中各对象的'value''label'值分别对应各选项的选项值与选项标签。

Text 文本/文字链接

type: 'string',
text: ''[,
titleHref: '',
attrs: {
  href: '',
}]

若组件JSON Schema对象中声明了类型字段type 的值为'string',且定义了text字段,参数类型为字符串,则渲染文本。

文本支持插入链接:

  • 若没有定义attrs属性,默认渲染文本;
  • 若设置了attrs对象的href链接属性,则渲染文字链接,点击文字时新建分页并打开href链接对应的目标页面。

Color 颜色选择器

type: 'string',
format: 'color'

若组件JSON Schema对象中声明了类型字段type 的值为'string',且定义了format 字段,参数值为'color',则渲染颜色选择器。

DatePicker 时间选择器

type: 'string',
format: 'date'

若组件JSON Schema对象中声明了类型字段type 的值为'string',且定义了format 字段,参数值为'date',则渲染时间选择器。

Input 文字输入框/文本域

type: 'string'[,
attrs: {
  type: 'textarea',
  [rows: ]
}]

若组件JSON Schema对象中声明了类型字段type 的值为'string',且没有定义其他与组件类型判断相关的参数值,则渲染文字输入框。

文字输入框包括两种样式 -- 默认样式和文本域:

  • 若没有定义attrs属性,渲染默认样式文本输入框;
  • 若设置attrs对象的type类型属性为'textarea', 则渲染文本域。
    • 对于文本域样式,可在attrs对象中定义rows字段,参数类型为数值,设置文本域行数。

InputNumber 数字输入框

type: 'number'

若组件JSON Schema对象中声明了类型字段type 的值为'number',且没有定义其他与组件类型判断相关的参数值,则渲染数字输入框。

Switch 开关

type: 'boolean'

若组件JSON Schema对象中声明了类型字段type 的值为'boolean',且没有定义其他与组件类型判断相关的参数值,则渲染开关。

ObjectArray 对象数组

对象数组可视为一个子表单组件,支持将多个组件打包成一个组件对象,并根据长度设置重复渲染所打包的对象内容。

type: 'array',
[defaultNum: number,] // 可选参数:若设置,渲染固定长度数组
items: {
  type: 'object',
  properties: {
    ...
  },
}

若组件JSON Schema对象中声明了类型字段type 的值为'array',并定义了items字段,且items对象中声明了类型字段type 的值为'object',则以itemsproperties参数为对象数组的schema对象,渲染所包含的组件。

使用场景:

若某个组件需要设置多个选项,且每个选项对应多个数据内容,则可将多个数据输入组件打包为一个对象数组组件,并按照所需的选项数量重复渲染,以获取各个选项对应的全部数据内容。

长度设置:

对象数组的渲染支持固定长度或动态长度:

  • 若在JSON Schema中定义了'defaultNum'参数,则按照参数值渲染固定长度的对象数组;
    • defaultNum值为1时,不渲染分割线;
    • defaultNum值大于1时,各组间自动渲染分割线。
  • 若未定义'defaultNum'参数,则在组件头部自动渲染数字选择器,根据数字选择器的值动态更改数组长度。

应用例子:

设置一组由用户定义的多选框时,对于各个选项,需要分别获取:选项标签、选项值、选项是否禁用 三个数据内容。将三个数据输入组件打包成一个对象数组组件,并根据多选框需要的选项数量灵活设置渲染长度。

  • 明确只需要设置一个多选框选项时,在JSON Schema中定义参数defaultNum: 1 :
option: {
  type: 'array',
  defaultNum: 1,
  items: {
    type: 'object',
    properties: {
      label: {
        title: '选项标签',
        description: '请输入标签文本内容',
        type: 'string',
        default: '备选项',
        required: true,
      },
      value: {
        title: '选项值',
        description: '请输入自定义选项值',
        type: 'string',
        default: '',
        required: false,
      },
      disabled: {
        title: '禁用状态',
        type: 'boolean',
        default: false,
        attrs: {
          'active-text': '禁用',
          'inactive-text': '启用',
        },
        required: false,
      },
    },
  },
},

表单子项渲染效果:

image

  • 明确需要设置两个多选框选项时,在JSON Schema中定义参数defaultNum: 2 (其余代码不变):

表单子项渲染效果:

image

  • 若不确定需要多少个多选框选项,则在JSON Schema中不定义参数defaultNum (其余代码不变),对象数组组件将自动在顶部渲染数据输入框,可在页面动态设置对象数组的长度:

表单子项渲染效果:

image