• Stars
    star
    572
  • Rank 77,995 (Top 2 %)
  • Language
    JavaScript
  • Created over 5 years ago
  • Updated over 1 year ago

Reviews

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

Repository Details

ant-design 组件库实时可视化编辑器,实时生成 react 代码

一个 可视化实时渲染的 ant-design 页面搭建工具

此项目是上古项目(2017年),代码基本很难维护,现在发布出来仅供参考思路,感兴趣的可以根据原理重构一版,实现一个更完备的可视化编辑

线上实例

https://yu-tou.github.io/antd-visual-editor/

托管在 github,第一次加载会比较慢

截图:

运行

npm run build;
npm run start;
# (已修复)因为我不太懂 webpack ,不太会配置,这个项目修改代码后实时生效还有问题。。求 pr

特性

  • 可视化编辑,同时实时生成结果代码,还可以单独预览
  • 丰富的数据编辑能力,可以编辑组件的二维属性
  • 组件可嵌套
  • 自适应布局
  • 除了 antd 的组件,还有一些原生 html 元素可使用

原理解析

1.如何实现实时编辑

第一步,抽象整个可视化工作台的数据表达,无非是放了一个什么组件在什么位置,这个组件的父组件是谁,这个组件的属性是什么

如下图:

一个组件的基础定义:

title 组件名
type  组件类型(组件真实类名)
can_place 组件是否可以包含子组件
children 组件的子组件,数组类型
is_native 组件是否是原生 html 元素
config  组件可用的配置信息
props 组件配置信息的值,包含样式和属性等

根据这些值,我们就可以渲染和编辑组件了,编辑组件后, 会有一个大的表示画布当前状态的数据结构存储到 state 中, 另外,有一个方法可以根据这个数据结构渲染出整个画布, 所以每次有任何编辑动作之后,我们会触发 forceUpdate,重新绘制画布 也就是说,添加组件,编辑属性,和画布的显示是分离的,中间由一个大的数据结构连接(就是图片里这个)

2.如何反向生成 react 代码

根据上图中的数据结构,反向遍历,可轻易的生成 React 代码

3.如何定义组件可用的配置

在 pages/coms/xxx 里面定义一个组件的可用配置,然后即可在主界面中选择组件后在右侧"属性编辑区"中编辑属性。

来看看我们可以定义哪些属性吧

以一个按钮为例

export default {
    "type": "Button",
    "title": "按钮",
    "props": {
        type: 'primary',  // 定义可以配置的 props
        content: '按钮一只', // 定义可以配置的 props
        style: {  // 定义可以配置的样式
            margin: "0px 10px 0px 0px"
        }
    },
    config: {   // 可用的配置项
        type: {   // type 这个配置的描述
            text: "主题",  // 配置的标题
            enum: [       // 可用的枚举,配置时会显示成下拉框
                'primary',
                'default',
                'dashed',
                'danger'
            ]
        },
        icon: {
            text: "图标",
        },
        content: {
            text: '文案',
        },
        style: {  // 可用的样式配置
            width: {  
                text: "宽度",
            },
            margin: {
                text: "外边距",
                type: "4-value" // 一种定制类型,会渲染成 4 个输入框
            }
        }
    },
}

这是最基本的配置项,只能适用于最基本的组件,但是遇到像 table 或者 Breadcrumb 这种组件就不行了

4.高级配置(二维数据)

以 Breadcrumb 为例,他有一个数据源的属性,数据源是一个数组+对象的混合表达,这种组件不少,应该如何定义呢

export default {
  "type":"Breadcrumb",
  "title":"面包屑",
  props:{
      routes:[  // 这里是数据源的属性,和默认值
      {
          breadcrumbName:"一级目录",
          path:"#",
        key:1
      },
      {
          breadcrumbName:"二级目录",
          path:"#",
        key:2
      }
    ]
  },
  config:{
      routes:{   // 如何表达这个属性应该如何配置
          text:"项目配置",
          enumobject:[{  // 一种新的类型,enumobject,对象枚举
            key:1,  
            dataIndex:"breadcrumbName",  // 枚举的对象的第一个 key 是什么
            title:"显示文本",    // 枚举的对象的第一个 key 的文本描述
            type:'String',      // 枚举的对象的第一个 key 的类型
          },{
            key:2,
            dataIndex:"path",    // 枚举的对象的第二个 key 是什么
            title:"链接",        // 枚举的对象的第二个 key 的文本描述
            type:'String',      //枚举的对象的第二个 key 的类型
          }]
    }
  }
}

最终的属性编辑区:

即可边界对象枚举属性

5.更复杂的组件

大家会发现,table 这种组件和上述的组件都不太一样,首先看纯数据表格

其实这里还好,只是 table 有两个属性,一个表达列的数据,一个表达行的数据,我们只需要两个对象枚举即可

{
    config:{
        columns:{
          text:"列管理",
          enumobject:[
            {
              title: '列文本',
              dataIndex: 'title',
              type:"String"
            },
            {
              title: '列key',
              dataIndex: 'dataIndex',
              type:"String"
            }
          ]
        },
        dataSource:{
          text:"值管理",
          enumobject:{
            type:'relative_props_object',
            target:'columns'
          }
        }
    }
}

这里实现了一个 关联,可以把 dataSource 的配置和 columns 关联起来 (relative_props_object)

6.更更复杂的表格

如果只是数据,还好, 但是 table 里可以还可以嵌套其他组件,每行每列,想想是不是头疼。。如下图

table 的每个 column 其实可以定义内部显示的元素,我们在默认值里就给他塞一个空的 layout 进去, 这样之后这里就会变成一个可以放置其他子元素的坑,具体不展开了,这里的逻辑比较复杂。

More Repositories

1

js2image

一个可以把js源代码压缩成一个ascii字符画的源代码的工具,压缩后的代码仍可运行 (A tool can compress JavaScript code to any ascii image and still run normally )
JavaScript
1,533
star
2

sketch-to-html

从 sketch 转换成 html,已无更新。。
JavaScript
681
star
3

Rabbit.js

一个烂尾项目,仅供吐槽
JavaScript
236
star
4

wechat-ai-summarize-bot

微信群聊总结助手 Nodejs 版
TypeScript
140
star
5

arduino-aliyun-iot-sdk

运行于 arduino 的 阿里云 IoT 接入 SDK,在底层连接的基础上增加数据回调绑定、发送数据和事件等 api 的封装,免去自己解析数据的痛苦
C++
131
star
6

s-mobx

轻量级mobx实现,仅供参考
JavaScript
125
star
7

eslint-plugin-996

a eslint plugin save you from 996
JavaScript
108
star
8

colors-web

自由/简单地让浏览器的console变的五彩斑斓。chalk or colors like library, use in browser console , with any colors
TypeScript
60
star
9

hancode

把你的JS代码翻译成中文书写的代码,并且可执行
JavaScript
41
star
10

qiaowei

社交网络辅助工具,企业用户和个人用户均可。致力于灵活解放生产力,而不是病毒营销。
JavaScript
28
star
11

my-public-share-keys

这些年来公开分享的一些文档整理,持续更新
28
star
12

nestjs-prisma-example

around nestjs, with prisma and some graphql lib,write less code,create power api
TypeScript
26
star
13

eth-self-token-example

在本地网络发布一个名叫 YuTou 的 token
TypeScript
18
star
14

Neon-work-clock

在新的标签页中显示一个漂亮的显示工作状态和时间的霓虹灯界面,可以控制是否在工作中,并统计工作时间等
HTML
15
star
15

xmind-to-ascii

transelate xmind to ascii structure
GCC Machine Description
15
star
16

gitlab-code-report

自动爬取gitlab,生成代码提交,代码变更行数,mr,issues 数据和排行
JavaScript
13
star
17

node-renren

nodejs版人人网oauth认证和api sdk
JavaScript
12
star
18

node-taobao

taobao api的nodejs sdk
JavaScript
11
star
19

frontend-modern-experience-share-slide

一个关于Web 体验技术发展前沿的小分享
Vue
10
star
20

kuihuabaodian

葵花宝典,不解释
JavaScript
10
star
21

auto_create_sequelize_models

this repo can auto create sequelize models from exist mysql.
CoffeeScript
8
star
22

hotconfig

hot config for nodejs
CoffeeScript
7
star
23

node-weibov2

基于node-weibo-v2改进的node平台微博v2接口sdk
JavaScript
7
star
24

CHKeychain

a tool to read and write info to ios keychain
Objective-C
7
star
25

beian.js

模拟代码中字符串备案的情形
JavaScript
7
star
26

queue_do

异步队列同步化,支持递归嵌套
JavaScript
7
star
27

koa-auto-controller

auto generate controller by folder struct for koa
JavaScript
6
star
28

mwc_control

用arduino输出pwm信号控制mwc飞控
Arduino
5
star
29

htmljs

the code for www.html-js.com 前端乱炖 in Age of Freedom
JavaScript
5
star
30

yaninput-plugin

可以任意嵌入App的颜文字输入法插件,一句话即可集成颜文字输入功能到自己的App中。
Objective-C
4
star
31

node-douban

豆瓣的nodejs实现的SDK
JavaScript
4
star
32

webpack-browserify-babel-rollup-example

这是一个示例项目,展示babel,browerify,webpack,rollup四者的基本用法,以及四者编译后的结果,可以借此了解这四个玩意到底是干了些什么事情。
JavaScript
4
star
33

walk_do

遍历文件夹并处理所得文件,支持同步遍历和异步遍历,同步遍历顺序严格使用深度搜索算法
JavaScript
4
star
34

my-booklist

我的书单,欢迎杭州的学生借阅。
3
star
35

animate-num

up to num with animate
JavaScript
3
star
36

fastdemo

make fast demo env use nodejs
JavaScript
3
star
37

mobiview

view or share your site with mobile style
TypeScript
3
star
38

eslint-plugin-kfc-crazy

a lint for KFC Crazy Thursday
JavaScript
3
star
39

readOnlineFile

读取远程图片或者文件并存储到本地
JavaScript
3
star
40

node-tqq

nodejs版腾讯api sdk
JavaScript
3
star
41

formatjson

format json
JavaScript
2
star
42

wp-pc-wallpaper

Wonderpal NFT PC Wallpaper generator
TypeScript
2
star
43

authorize

国内各大微博的authorize链接生成方法集合。原理基本一样,稍有差别。
JavaScript
2
star
44

fly_control_ios

蓝牙控制四轴的客户端程序
Objective-C
1
star
45

cpu-overload-monitor

display cpu overload status in terminal
JavaScript
1
star
46

s-ioc

这是一个试验项目,主要是学习下如何实现 ioc 模式
TypeScript
1
star
47

somethingfrom2009

从学习前端来瞎写的各种乱七八糟的东西。
JavaScript
1
star
48

the-most-beautiful-html-construction

the most beautiful html construction
1
star
49

changelog-clog

JavaScript
1
star
50

sns-error-info

整理各SNS平台的错误码所对应的英文和中文描述,可自己扩展,方便在应用中错误提示,也可以当做手册查询
JavaScript
1
star
51

tap-plus-one

一个 arduino 程序,点一次加一,传说程序员通过这个装置来记录每天被骚扰的次数
Arduino
1
star
52

htmljs-publish-atom

一个atom编辑器的插件,直接把markdown文件发送到前端乱炖(www.html-js.com)网站的专栏。
CoffeeScript
1
star