• This repository has been archived on 11/May/2021
  • Stars
    star
    1,585
  • Rank 29,515 (Top 0.6 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 5 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

f-render | 基于 ElementUI 的表单设计器

f-render | 基于 ElementUI 的表单设计器

MIT npm bundle size npm Netlify Status gitub pages Star on GitHub

介绍

f-render 是基于 vue-ele-form 开发的可视化表单设计工具, 适用于 各种流程引擎和动态表单项目,大大节省你的开发时间;

f-render 演示图

注意

注意,此设计器不是独立存在的,是依托于 vue-ele-form,在使用前请务必阅读 vue-ele-form 的文档

特性

  • 组件方式:以组件方式接入,1 分钟轻松接入;
  • 体积小:Gzip 压缩后 100k 左右;
  • 易扩展:可以在不更改源码的情况下增删改属性、组件;

Demo

https://dream2023.gitee.io/f-render/

教程

虽然 f-render 可以做到在不更改源码的情况下实现大量的定制化,但是依然有不少人希望能够根据公司的需求进行二次开发。

所以我推出了一个从 0 实现整个项目的 教程,如果感兴趣 f-render 的实现过程和思考,可以点击 从 0 实现可视化表单组件 进行学习。

1 分钟快速接入

第 1 步:安装

yarn add element-ui  # npm install element-ui -S
yarn add vue-ele-form # npm install vue-ele-form -S
yarn add f-render # npm install f-render -S

第 2 步:注册

// vue-ele-form 的注册可参考:https://www.yuque.com/chaojie-vjiel/vbwzgu/xl46cd
import EleForm from "vue-ele-form";
import FRender from "f-render";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";

Vue.use(ElementUI);
Vue.use(EleForm);
Vue.component("f-render", FRender);

第 3 步:使用

<template>
  <f-render
    @save="handleSave"
    :loading="loading"
    height="calc(100vh - 60px)"
    :config="formConfig"
  />
</template>

<script>
  export default {
    data() {
      return {
        loading: false,
        formConfig: {}
      };
    },
    methods: {
      handleSave(res) {
        // 这里是保存到 localStorage,你可以保存到服务器
        localStorage.setItem("form-config", res);
        this.$message.success("保存成功啦~");
      }
    },
    mounted() {
      // 模拟异步加载
      this.loading = true;
      setTimeout(() => {
        this.loading = false;
        this.formConfig = localStorage.getItem("form-config") || "";
      }, 1000);
    }
  };
</script>

用户模式

我们把动态表单分为两个阶段:

  • 首先是设计阶段:通过拖拽设计表单;
  • 然后是用户阶段:将设计好的表单以纯表单的形式让用户填写。

我们别分称这两个阶段的表单为设计模式和用户模式。设计模式的表单配置我们已经讲了,下面看用户模式下的表单配置:

基于 f-render 的配置

通过属性 pure, 可以直接做为表单使用,其数据提交方式同 vue-ele-form 一样,具体可查看文档

<template>
  <f-render
    v-model="formData"
    :request-fn="handleSubmit"
    @request-success="handleSuccess"
    :config="formConfig"
    pure
  />
</template>

<script>
  export default {
    data() {
      return {
        formData: {},
        formConfig: ""
      };
    },
    methods: {
      handleSubmit(data) {
        // eslint-disable-next-line no-console
        console.log(data);
        return Promise.resolve();
      },
      handleSuccess() {
        this.$message.success("创建成功");
      }
    },
    mounted() {
      // 模拟异步加载
      this.loading = true;
      setTimeout(() => {
        this.loading = false;
        this.formConfig = localStorage.getItem("form-config") || "";
      }, 1000);
    }
  };
</script>

基于 vue-ele-form 的配置

如果你的可视化设计和表单使用,不再一个系统,可以直接使用 vue-ele-form,不必安装 f-render,具体如下:

<template>
  <ele-form
    v-model="formData"
    :request-fn="handleSubmit"
    @request-success="handleSuccess"
    v-if="formConfig"
    v-bind="formConfig"
  />
</template>

<script>
  export default {
    data() {
      return {
        formData: {},
        formConfig: null
      };
    },
    methods: {
      handleSubmit(data) {
        // eslint-disable-next-line no-console
        console.log(data);
        return Promise.resolve();
      },
      handleSuccess() {
        this.$message.success("创建成功");
      }
    },
    mounted() {
      // 模拟异步加载
      setTimeout(() => {
        try {
          // 这里必须对字符串进行反序列化
          this.formConfig = eval(`(${localStorage.getItem("form-config")})`);
        } catch {
          this.$message.error("数据解析失败");
        }
      }, 1000);
    }
  };
</script>

定制化

新增官方扩展组件(以富文本扩展为例)

安装组件

yarn add vue-ele-form-quill-editor

注册组件

Vue.component("quill-editor", EleFormQuillEditor);

配置属性

<template>
  <!-- 省略其它属性 -->
  <f-render :comps="comps" />
</template>

<script>
  // 默认配置
  import comps from "f-render/src/fixtures/comps";
  // 富文本配置
  import quillEditor from "f-render/src/fixtures/extends/quill-editor";
  // 可以更改显示组件位置,默认为 10
  // 这里更改为 2,显示更靠前
  quillEditor.sort = 2;

  export default {
    data() {
      return {
        // 拼接上即可
        comps: comps.concat(quillEditor)
      };
    }
  };
</script>

新增自定义组件

创建组件并全局注册

需要根据 vue-ele-form 文档创建自定义组件,并注册。

书写配置

你可以参考源码中的配置,一下是范例和属性说明:

// custom-url.js
export default {
  // 假如这个组件叫 url(必填)
  type: "custom-url",
  // 默认标签名(必填)
  label: "URL",
  // 用于排序,值越小,越靠前
  sort: 1,
  // 属性配置
  config: {
    // 属性配置说明地址(可省略)
    url: "https://www.xxx.com",
    // 组件属性配置(不知道啥是组件属性,可以看一下界面右侧)
    attrs: {
      // config 配置 参考 FormDesc:
      // https://www.yuque.com/chaojie-vjiel/vbwzgu/iw5dzf#KOPkD
      config: {
        // max 为属性名
        max: {
          type: "number",
          label: "最大输入长度"
        },
        name: {
          type: "input",
          label: "原生 name",
          // 必填
          required: true
        }
        // ....
      },
      // 默认值,如果在配置文件里设置了,则每个组件都会携带
      data: {
        name: "url"
      }
    },
    // 表单项配置,是 FormDesc 中非 attrs 的其它配置,
    // 具体可看:https://www.yuque.com/chaojie-vjiel/vbwzgu/iw5dzf#hl4pm
    common: {
      config: {
        // 默认值
        default: {
          type: "input",
          label: "默认值"
        }
      },
      data: {}
    }
  }
};

合并配置并传入

<template>
  <!-- 省略其它属性 -->
  <f-render :comps="comps" />
</template>

<script>
  import comps from "f-render/src/fixtures/comps";
  import customUrl from "some/path/custom-url";
  export default {
    data() {
      return {
        comps: comps.concat(customUrl)
      };
    }
  };
</script>

定制化原组件配置 & 表单配置

  • 组件配置目录:f-render/src/fixtures/comps.js
  • 表单配置目录:f-render/src/fixtures/form-props.js
  • 表单项通用属性配置:f-render/src/fixtures/form-item-common.js
  • 扩展组件目录:f-render/src/fixtures/extends/[扩展组件名].js

如果你想修改组件属性或者表单的属性,减少或者增加组件,可以将上述文件拷贝到自己的项目目录,参考上述配置说明,进行更改,并传入即可:

<!-- formProps 是表单属性 -->
<!-- comps 是组件列表和属性 -->
<!-- formItemCommon 是表单项通用属性配置 -->
<f-render
  :form-props="formProps"
  :comps="comps"
  :form-item-common="formItemCommon"
/>

具体而言,如果想让每个 input 组件都携带 clearable: true 的属性,我们可以这样操作:

<template>
  <!-- 其它属性省略 -->
  <!-- 将更改后的 comps 传递过去即可 -->
  <f-render :comps="comps" />
</template>

<script>
  import comps from "f-render/src/fixtures/comps";
  // 查找 input 组件,当然你也可以看源码,直接查看索引
  const inputIndex = comps.findIndex(item => item.type === "input");
  // 更改 config.attrs.data 值即可
  comps[inputIndex].config.attrs.data = { clearable: true };

  export default {
    data() {
      return {
        comps
      };
    }
  };
</script>

定制化右侧 Tabs

我们可以通过 isShowRight 属性来控制右侧面板是否显示,通过 rightTabs 来定制具体显示的面板名称,具体如下:

<template>
  <!-- 定制化右侧 tabs -->
  <f-render :right-tabs="tabs" />
</template>

<script>
  export default {
    data() {
      return {
        tabs: [
          { label: "表单项属性配置", name: "form-item-common" },
          { label: "组件属性配置", name: "form-item-attrs" }
          // 注释下面的内容,就可以不显示
          // { label: "表单配置", name: "form-props" }
        ]
      };
    }
  };
</script>

样式定制化

直接进行样式覆盖即可,注意不要加 scoped,否则覆盖不成功

二次开发

如果仅通过属性样式定制化已无法满足的你和你产品经理的要求,那就需要进行定制化开发,我个人觉得代码整体还是非常简单的,你可以 clone 代码或者下载后(建议用gitee),进行相应的更改,更改后有两种处理方式:

  • 直接放到项目目录里,并将安装 dependencies 的依赖复制到项目,进行开发即可;
  • 直接开发,然后发布到公司私服,如果是开源,则可以发到 GitHub 或者 gitee,然后安装自己的即可

具体的细节,开头提的教程里会有详细的过程,希望大家可以支持一下。

f-render 问答集锦

Props 说明

props: {
  // 表单内容
  config: {
    type: [Object, String],
    required: true
  },
  // 设计器整体高度
  height: {
    type: [String, Number],
    default: "400px"
  },
  // 保存格式
  saveFormat: {
    type: String,
    default: "string",
    validator(val) {
      return ["object", "string"].includes(val);
    }
  },
  // 是否纯净(用于显示表单)
  pure: Boolean,
  // 表单配置
  formProps: {
    type: Object,
    default: () => formProps
  },
  // 表单项配置
  formItemCommon: {
    type: Object,
    default: () => formItemCommonDefault
  },
  // 组件列表
  comps: {
    type: Array,
    default: () => comps
  },
  // 操作配置
  operations: {
    type: Array,
    default: () => ["preview", "data", "code", "batch", "clear", "save"]
  },
  // 是否显示右侧
  isShowRight: {
    type: Boolean,
    default: true
  },
  // 右侧属性面板 Tabs
  rightTabs: {
    type: Array,
    default: () => [
      { label: "表单项属性配置", name: "form-item-common" },
      { label: "组件属性配置", name: "form-item-attrs" },
      { label: "表单配置", name: "form-props" }
    ]
  },
  // 是否在加载
  loading: Boolean,

  // 表单相关(pure 为 true 时), 同 vue-ele-form
  // https://www.yuque.com/chaojie-vjiel/vbwzgu/dyw8a7
  requestFn: Function,
  isLoading: Boolean,
  formError: Object,
  // ....
},

插槽

  • left:左侧组件列表
  • main: 中间区域
  • main-header: 头部操作区
  • main-content: 表单设计区
  • right: 右侧属性配置区

举例:

<template>
  <f-render>
    <!-- 左侧插槽 -->
    <template v-slot:left="{frender}">
      <div>
        <div>left</div>
        <div>{{frender.comps}}</div>
      </div>
    </template>
  </f-render>
  <template></template
></template>

其中 frender 数据是 f-render 组件数据的集合,具体都有哪些数据,可以参考源码,其它插槽均有此参数。

生态

Project Status Description
vue-ele-form npm 接基于 ElementUI 的数据驱动表单
f-render npm 专为 vue-ele-form 开发的可视化表单设计工具
vue-ele-form-json-editor npm JSON 编辑器(vue-ele-form 扩展)
vue-ele-form-upload-file npm upload 文件上传组件(vue-ele-form 扩展)
vue-ele-form-image-uploader npm 上传图片增强组件(vue-ele-form 扩展)
vue-ele-form-tree-select npm 树形选择框组件(vue-ele-form 扩展)
vue-ele-form-table-editor npm 表格编辑器(vue-ele-form 扩展)
vue-ele-form-dynamic npm 动态表单(vue-ele-form 扩展)
vue-ele-form-video-uploader npm 上传视频增强组件(vue-ele-form 扩展)
vue-ele-form-quill-editor npm 富文本编辑器(vue-ele-form 扩展)
vue-ele-form-markdown-editor npm markdown 编辑器(vue-ele-form 扩展)
vue-ele-form-bmap npm 百度地图组件(vue-ele-form 扩展)
vue-ele-form-codemirror npm 代码编辑器(vue-ele-form-gallery 扩展)
vue-ele-form-gallery npm 图片/视频展示组件(vue-ele-form 扩展)
vue-ele-form-data-editor npm 轻量级数据编辑器(vue-ele-form 扩展)

特别感谢赞助者

优客服
圣捷远创
damonnie
xzusoft
seeenter
高亢

如果您觉得对您有所帮助, 可以请作者喝一杯咖啡, 让开源走的更远, 点击进入码云赞赏一下, 并加入下面交流群, 将链接发送给我

Contributors

Thanks goes to these wonderful people (emoji key):


张超杰

📖 💻 🤔

Wisen

💻

IWANABETHATGUY

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

More Repositories

1

vue-ele-form

基于element-ui的数据驱动表单组件
Vue
874
star
2

ThinkPHP5-alipay

ThinkPHP5 支付宝支付扩展库, 包括手机网站支付、电脑网站支付、支付查询、退款、退款查询、对账单等
PHP
228
star
3

vue-run-sfc

Vue DEMO利器, 在线运行 & 编辑 Vue 单文件
Vue
217
star
4

awesome-lesscode

less code / no code 前后端实践和工具列表
193
star
5

vue-ele-upload-image

基于 element-ui 的简单且强大的图片上传组件
Vue
71
star
6

vue-ele-import

超简单、好用的 element-ui Excel 导入组件
Vue
58
star
7

vue-ele-upload-video

通过对 element-ui 中 upload 组件进一步封装,使得视频上传更加容易
Vue
53
star
8

vue-ele-editable

vue-ele-editable | 高效、简单、强大的 element-ui 行内编辑组件
Vue
39
star
9

vue-ele-table

vue-ele-table | 基于 element-ui 数据驱动表格
Vue
37
star
10

super-antd

super-antd 是一个简单且数据驱动友好的 React 组件库。
TypeScript
33
star
11

ele-table-editor

基于 element-ui 的表格编辑组件
Vue
32
star
12

vuepress-plugin-run

vuepress 在线运行 Vue 单文件
JavaScript
26
star
13

wx2tt

微信小程序转头条小程序工具
JavaScript
25
star
14

react-schema-render

react-schema-render 是一个通用型 schema 转 React 组件的工具组件。
TypeScript
18
star
15

safe-load-script

Dynamically load script and can be safely executed
TypeScript
15
star
16

vue-ele-form-codemirror

vue-ele-form 的 代码编辑器
Vue
14
star
17

vue-ele-form-dynamic

vue-ele-form 的动态表单组件
Vue
13
star
18

vue-ele-gallery

利用 element ui 组件库构成的画廊组件
Vue
13
star
19

itaro

Taro 按需编译解决方案。
TypeScript
12
star
20

vue-ele-upload-file

使 element-ui upload 组件更简单、好用
Vue
12
star
21

vuex-micro-frontends

微前端 vuex 父子通信解决方案. vue micro frontends communication solution.
TypeScript
11
star
22

docsify-plugin-run

docsify 在线运行 Vue 单文件
HTML
11
star
23

vue-ele-form-json-editor

vue-ele-form 的 json 编辑器
Vue
11
star
24

easy-affix

Vue图钉组件, 可以将内容固定在屏幕上,并且不随页面的滚动而滚动,常用于侧边菜单和导航栏等
Vue
11
star
25

vue-ele-form-image-uploader

vue-ele-form 的图片上传组件
Vue
11
star
26

vue-ele-form-table-editor

vue-ele-form 的表格内容编辑器
Vue
11
star
27

vue-auto-text

vue-auto-text | 文字大小自适应组件
Vue
10
star
28

vue-ele-form-video-uploader

vue-ele-form 的视频上传组件
Vue
10
star
29

vue-ele-form-gallery

专为 vue-ele-form 打造的图片/视频展示组件
Vue
9
star
30

blog

个人博客和视频
JavaScript
9
star
31

vue-ele-form-markdown-editor

vue-ele-form 的 markdown 编辑器
Vue
8
star
32

vue-ele-form-quill-editor

vue-ele-form 的富文本编辑器
Vue
8
star
33

vue-ele-form-upload-file

vue-ele-form 的文件上传扩展组件
Vue
8
star
34

vue-ele-form-bmap

vue-ele-form 的 百度地图组件
Vue
8
star
35

all-trim

支持字符串、数组、对象、嵌套数组等等的去除空格
JavaScript
7
star
36

fgen-for-vscode

vue-ele-form-generator的vscode扩展
JavaScript
7
star
37

vue-hover-mask

vue hover 遮罩组件
Vue
7
star
38

antd-image-cropper

Another image cropper for Ant Design Upload。antd 图片裁剪组件。
TypeScript
7
star
39

easy-go-top

easy-go-top | 简单 & 强大的 vue 回到顶部组件
JavaScript
6
star
40

my-github-stars

有意思,有启发的 github 项目
5
star
41

vue-image-pro

An image component for vue.js | 一个vue图片增强组件
Vue
5
star
42

fgen-cli

vue-ele-form-generator的cli工具
JavaScript
4
star
43

vue-ele-image

对 element-ui image组件进一步封装, 使其更简单、易用
Vue
4
star
44

vue-ele-steps

vue-ele-steps | 让 element-ui steps 更简单
Vue
3
star
45

vue-ele-form-tree-select

vue-ele-form 的树形选择框
Vue
3
star
46

data-mapping

@dream2023/data-mapping is a perfect object mapping solution。
TypeScript
2
star
47

cross-stack

组件级别的跨技术栈嵌入研究
Vue
2
star
48

vue-ele-form-data-editor

vue-ele-form 的极简数据编辑器
Vue
1
star
49

frontend-and-backend-demo

TypeScript
1
star
50

cypress-solidjs

Browser-based Component Testing for SolidJS with Cypress.io 🧡
TypeScript
1
star
51

docute-plugin-run

docute 在线运行 Vue 单文件
HTML
1
star