20 Star 62 Fork 7

ncform / ncform

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

ncform

CircleCI vue 2.x license MIT Cypress.io tests Gitter lerna

English Version

preview

ncform,一种令人愉悦的表单开发方式,仅需配置即可生成表单UI及其交互行为。

自带丰富的 标准组件校验规则,开箱即用。

具备强大的 控件交互扩展能力,做你所想。

如果你犹豫不决,你可以阅读这篇文章:如何选型

Playground


Playground

Playground 体验一下ncform的魅力,可加深你对ncform的了解

Playground 展示了ncform大部分的使用场景例子(I believe the example is the best document),建议先仔细浏览下,例子中的配置实际开发中一般都可以直接使用滴

Quick Start

In node.js

1.install

npm i @ncform/ncform @ncform/ncform-common --save
npm i @ncform/ncform-theme-elementui element-ui axios --save 

2.import

import Vue from 'vue';
import vueNcform from '@ncform/ncform';

import Element from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import ncformStdComps from '@ncform/ncform-theme-elementui';
import axios from 'axios';

Vue.use(Element);
Vue.use(vueNcform, { extComponents: ncformStdComps });
window.$http = Vue.prototype.$http = axios;

3.usage

# demo.vue

<template>
  <div>
    <ncform :form-schema="formSchema" form-name="your-form-name" v-model="formSchema.value" @submit="submit()"></ncform>
    <el-button @click="submit()">Submit</el-button>
  </div>
</template>
<script>
export default {
  data () {
    return {
      formSchema: {
        type: 'object',
        properties: {
          name: {
            type: 'string'
          }
        }
      }
    }
  },
  methods: {
    submit () {
      this.$ncformValidate('your-form-name').then(data => {
        if (data.result) {
          console.log(this.$data.formSchema.value)
          // do what you like to do
        }
      })
    }
  }
}
</script>

可参考ncform-demo项目

In browser

<html>

<head>
  <link rel="stylesheet" href="https://unpkg.com/element-ui@2.4.3/lib/theme-chalk/index.css">
</head>

<body>
  <div id="demo">
    <ncform :form-schema="formSchema" form-name="your-form-name" v-model="formSchema.value" @submit="submit()"></ncform>
    <el-button @click="submit()">Submit</el-button>
  </div>

  <script type="text/javascript" src="https://unpkg.com/vue/dist/vue.min.js"></script>
  <script type="text/javascript" src="https://unpkg.com/axios/dist/axios.min.js"></script>

  <script type="text/javascript" src="https://unpkg.com/@ncform/ncform-common/dist/ncformCommon.min.js"></script>
  <script type="text/javascript" src="https://unpkg.com/@ncform/ncform/dist/vueNcform.min.js"></script>

  <script type="text/javascript" src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script type="text/javascript" src="https://unpkg.com/@ncform/ncform-theme-elementui/dist/ncformStdComps.min.js"></script>

  <script type="text/javascript">
    Vue.use(vueNcform, { extComponents: ncformStdComps });

    // Bootstrap the app
    new Vue({
      el: '#demo',
      data: {
        formSchema: {
          type: 'object',
          properties: {
            name: {
              type: 'string'
            }
          }
        }
      },
      methods: {
        submit() {
          this.$ncformValidate('your-form-name').then(data => {
            if (data.result) {
              // do what you like to do
            }
          });
        }
      }
    });
  </script>
</body>

</html>

特性

  • 配置生成:一个JSON数据结构完整描述一个表单的UI及其交互行为,表单的开发工作就完成了

  • 灵活互动:通过强大的dx表达式,表单控件可灵活与其它表单控件进行互动

  • 标准组件:ncform定义了一套标准的表单组件配置规范,未经扩展即可满足你90%以上的表单开发需求

  • 校验丰富:自带常用的十几种验证规则,满足你90%以上的表单验证需求

  • 扩展友好:表单的组件和校验规则都可灵活扩展,并且提供了工具简化扩展工作

文档

解决痛点

后台管理系统中绝大部分的功能不是查询列表,就是录入表单。
表单的开发是一种无趣的,无营养的,高消耗的重复体力活,费时费力。
表单控件间的交互功能,表单项的校验规则,都极容易产生“八哥”。
SO,为了提高表单开发效率,减少失误,提高表单规范和健壮性,最重要,提高开发人员的开发幸福感,项目因此而生

重复造轮子?

圈子里比较有名的类似方案(参考项目列举的几个),存在以下一个或多个的问题:

  1. 基本完全按照json-schema来设计,而仅用json-schmea来描述一个表单并不合适

  2. 对于表单项之间的关联交互,复杂的验证逻辑,没有很好的解决方案

  3. 无法仅提供一份配置就完成所有表单的UI及交互行为(意义在于配置可储存)

  4. 默认提供的基础组件不够丰富,难以覆盖实际开发中常用的表单组件

  5. 很久没维护,代码编写风格过于久远,难于扩展

  6. 组件扩展问题:当前主流的组件实现方案是Vue和React,没有友好的方案,需要使用者自行扩展支持

为了解决以上问题,走上了造轮子之路。。。

为什么不用标准的json-schema?

因为json-schema是面向数据(data)而非表单(ui),对于声明一个表单不太友好。

对于一个表单,关心的是有哪些表单项,表单项长啥样,校验规则怎样,这些都跟字段相关,在一处管理最直观

来个简单的对比:

  • json-schema例子:

json-schema sample

  • ncform例子:

ncform schema sample

json-schema对于验证规则,声明在各个地方,不好管理。而ncform都集中在rules。这种设计也便于后面开发表单制作IDE

dx表达式:

通过dx表达式,你可以通过{{$root.xxx}}取得指定字段的值,然后用原生的JS书写你的任意逻辑表达式

  • 指定对象中的属性值,例子:
disabled: 'dx: {{$root.person.age}} < 18'
  • 指定数组中的某一项的值,例子:
disabled: 'dx: {{$root.persons[0].age}} < 18'
  • 指定数组中同一项的属性,例子:
disabled: 'dx: {{$root.persons[i].age}} < 18'
disabled: 'dx: {{$root.persons[i + 1].age}} < 18'
  • 访问全局配置中的常量数据,例子:
disabled: 'dx: {{$root.person.age}} === {{$const.max}}'

// 全局配置如下:
globalConfig: {
  constants: { max: 18 }
}

dx表达式也可用 函数 代替:

function(formData, constData, selfData, tempData, itemIdxChain) { ... }

  • formData:对应于 {{$root}}。表单的数据
  • constData: 对应于 {{$const}}。全局配置中的常量数据
  • selfData:对应于 {{$self}}。只用于 ui.preview.value,指代本身的值
  • tempData:对应于 {{$temp}}。临时存储的值
  • itemIdxChain:仅对数组项有用,指代当前所在的数组的索引路径,如[1, 0]

一些常见的例子如下:

// 一般对象属性
disabled: function(formData) {
  return formData.person.age < 18;
}

// 数组项
disabled: function(formData, constData, selfData, tempData, itemIdxChain) {
  const [ i ] = itemIdxChain;
  return formData.persons[i].age < 18;
}

// 全局常量
disabled: function(formData, constData) {
  return formData.person.age < constData.max;
}

设计思想

ncform = ncform容器 + ncform主题标准组件

design

一个系统项目,一般都会使用一种UI库(如vue)及其之上的UI实现方案(如elementui) 为了与之和平共处,ncform的标准组件可采用与之一致的UI实现方案

ncform Vue版默认提供了elementui主题的标准组件【点击查看】

如果你是iview的粉丝,通过遵循ncform标准组件的规范开发iview主题的标准组件即可

思想:把各种主题的标准组件“丢进”ncform容器,就是一个可配的表单开发利器

Schema Generator

通过 Schema Generator,可以加速你写form schema的速度

你也可以尝试这个第三方的 VSCode 插件: vscode-plugin-ncform-schema

参考项目

作者

  • Daniel.xiao :ncform的设计者和主要实现者
  • Kyle.lo :ncform表单校验部分的实现者和标准组件的主力开发者

贡献者

daniel.xiao
daniel.xiao

☺️
Kyleloh
Kyleloh

💻
liuxuewei
liuxuewei

💵
woodytechnology
woodytechnology

💵

赞助支持

ncform 是MIT许可的开源项目,完全免费使用。 如果它对你有用,也许你可以请我一杯咖啡:)。

一次性支持

每月支持

通过 Patreon 成为支持者或赞助者

贡献

请阅读 贡献 指南.

The MIT License (MIT) Copyright (c) 2018-present, Wei (Daniel) Xiao <danielwxx@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

ncform,一种令人愉悦的表单开发方式,仅需配置即可生成表单UI及其交互行为。 展开 收起
JavaScript 等 4 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
JavaScript
1
https://gitee.com/ncform/ncform.git
git@gitee.com:ncform/ncform.git
ncform
ncform
ncform
master

搜索帮助