前一阵子拜访了一些小伙伴,大家都表示苦前端太久了,需要花费不少时间在前端开发上。本着在不损失灵活性的前提下尽可能提高开发效率的原则,作者尝试在框架内集成了拖拽方式生成Vue用户界面的功能作为补充,以方便快速生成增删改查界面,也可以用于大屏展示及简单的网页制作。

一、技术原理

1.1 布局

  目前仅实现了基于vue-grid-layout的网格布局,设计画布上的每个组件动态加载至对应的GridItem内,同时根据组件配置绑定相应的prop及事件。

<!--src/components/Designers/View/VueVisualDesigner.vue-->
<grid-layout ref="gridLayout" class="editorCanvas" :layout.sync="layout"
:col-num="layoutOption.colNum" :row-height="layoutOption.rowHeight"
:is-draggable="!preview" :is-resizable="!preview" @dragover.native="onDragOverGrid">
<grid-item class="widgetPanel" v-for="item in layout" :x="item.x" :y="item.y" :w="item.w"
:h="item.h" :i="item.i" :key="item.i"
@resize="onItemResize(item)" @container-resized="onItemResize(item)">
<div v-if="!preview" class="widgetOverlay" @click="onSelectWidget(item)"></div>
<!-- 动态widget -->
<component :ref="item.i" :is="item.c" :style="makeWidgetStyle(item)"
v-model="runState[item.m]" v-bind="item.p" v-on="item.a">
{{ item.t }}
</component>
</grid-item>
</grid-layout>

1.2 组件

  每个组件的配置抽象为以下示例的接口,用于描述组件的属性及相关的布局位置信息,注意分为设计时与运行时属性,运行时属性仅在预览与运行时动态生成。

//src/runtime/IVueVisual.ts
export interface IVueLayoutItem {
/** 组件名称 eg: Input */
n: string;
/** v-text */
t?: string;
/** v-model */
m?: string;
/** 组件Props eg: {size: 'mini'} */
p: object;
/** 组件绑定的Props eg: {data:':data'} */
b?: object;
/** 设计时事件定义 eg: {click: {IVueEventAction}} */
e?: object;
/** 运行时生成的事件处理器,用于v-on绑定 eg: {click: function(){...}} */
a?: object;
/** 运行时动态加载的Vue组件 */
c?: any;
} /** 基于Grid的布局项 */
export interface IVueGridLayoutItem extends IVueLayoutItem {
i: string;
x: number;
y: number;
w: number;
h: number;
}

1.3 状态

  光有组件及布局只能在界面上呈现,还需要绑定业务数据,所以每个视图模型都有对应的状态设置(即Vue的data),描述状态的名称、类型及相应的设置值的操作,视图的状态在运行时会根据设置从后端加载数据或置为默认值。

/** 设计时的视图状态项 */
export interface IVueState {
Name: string;
Type: string;
/**设置状态值的操作,eg: 调用服务后设置状态值 */
Value: IVueEventAction;
}

1.4 事件

  某些如Button类的组件可以绑定相应的事件处理,目前事件处理主要分为加载数据(LoadData)及递交数据(PostData)两类,分别对应于从后端读数据至当前状态与递交当前状态数据至后端处理。

export type EventAction = 'LoadData' | 'PostData' | 'RunScript';

export interface IVueEventAction {
/** 操作类型, eg: LoadData */
readonly Type: EventAction;
} export interface IVueLoadDataAction extends IVueEventAction {
/** 状态目标 eg: State = LoadService() */
State: string;
Service: string; //后端服务: eg: sys.OrderService.listAll
ServiceArgs: any[]; //eg: [{Name:'arg1', Type:'string', Value:'"rick"'}], Value为表达式
}

1.5 工具箱

  可供拖放至画布的组件由全局配置"VueWidgets"定义,分为全局注册的组件及自定义组件,自定义组件可以是代码方式的视图模型,也可以是可视化方式的视图模型。

//自定义Widget配置定义
{
"Name": "Table", //组件名称
"Component": "sys.ExTable", //指向自定义视图模型或全局组件名称(eg: ElInput)
"Icon": "fa fa-table", //工具箱图标
"Width": 12, //默认网格宽度
"Height": 6, //默认网格高度
"Props": [ //组件的props
{
"Name": "columns",
"Type": "array",
"Default": [],
"Editor": "sys.ExTableColumnEditor" //指向自定义属性编辑器
},
{
"Name": "rows",
"Type": "array",
"Default": []
}
]
}

二、效果演示

  注意新建视图模型时类型选择:Vue Visual,原来的代码方式为Vue Code。

  设计界面的功能区如下图所示:

具体操作演示请看短视频

三、本篇小结

  作者非专业前端,在这里只是抛砖引玉,希望感兴趣的小伙伴继续完善,比如自由布局(绝对定位)、组件动画等的实现。另边码代码边码文实属不易,作者需要您的支持请您多多点赞推荐!

拖拽方式生成Vue用户界面的更多相关文章

  1. _ZNote_编程语言_Qt_信号槽实现_拖拽方式使用控件

    所谓的信号槽,实际上就是观察者模式. 当某个事件发生后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal). 这种发出信号是没有目的的,类似于广播.如果对象对这个信号感兴趣,它就会使 ...

  2. 可拖拽排序的vue组件

    最近在优化一个vue的博客系统,想实现文章列表处的文章拖拽功能.就试了一下awe-dnd vue插件,觉得还挺好用的. 安装 npm install awe-dnd --save 使用 在main.j ...

  3. gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)

    前言   Excel功能强大,应用广泛.随着web应用的兴起和完善,用户的要求也越来越高.很多Excel的功能都搬到了sass里面.恨不得给他们做个Excel出来...程序员太难了... 去年我遇到了 ...

  4. 怎么使用formBuilder以拖拽方式编写页面

    1.以admin用户登录系统,打开formbuilder http://localhost:8081/framework/main/formbuilder 2.从右方组件中,用鼠标拖拽页面所需的组件到 ...

  5. Chrome - XPath Helper插件 使用手工拖拽方式无法正常安装的解决办法

    安装前准备: (1)下载 XPath Helper资源: 链接: https://pan.baidu.com/s/1yEnngIJz8fT9fNv3aHhs7w 提取码: afy3 (2)Chrome ...

  6. winfrom的两种拖拽方式和界面阴影

    方式1private Point mouseOffset; //记录鼠标指针的坐标 private bool isMouseDown = false; //记录鼠标按键是否按下 private voi ...

  7. android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面

    关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等.第一:大多数实现库都难以进行动画和样式的自己定义. 第二:不能非常好的兼容多种滚 ...

  8. 【拖拽可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!

    "整篇文章较长,干货很多!建议收藏后,分章节阅读." 一.设计方案 整体设计方案思维导图: 整篇文章,也将按照这个结构来讲解. 若有重点关注部分,可点击章节目录直接跳转! 二.项目 ...

  9. 14-UIKit(拖拽手势、布局)

    目录: 1.手势创建的拖拽方式 2.frame,bounds,transform,center区别 3.触控(touch) 4.布局 5.代码布局 回到顶部 1.手势创建的拖拽方式 创建手势对象,修改 ...

随机推荐

  1. git hooks All In One

    git hooks All In One $ xgqfrms git:(main) cd .git/ $ .git git:(main) ls COMMIT_EDITMSG HEAD branches ...

  2. how to import a SQL file in MySQL command line

    how to import a SQL file in MySQL command line execute .sql file, macOS $mysql> source \home\user ...

  3. You Don't Know Chrome Features

    You Don't Know Chrome Features URL auto convert to QR Code click the tab URL address click QRCode ic ...

  4. 详解稳定币圣杯USDN

    稳定币飞速发展,USDN 一骑绝尘,但因合规问题饱受质疑.合规稳定币作为后来者,奋起直追,亦光耀夺目.而更符合区块链精神的稳定币(抵押其他资产生成稳定币),长期以来只有 Maker 的 DAI 能够在 ...

  5. java数据类型(进阶篇)

    public class note03 { public static void main(String[] args) { //数据类型拓展 //1.整数拓展 //进制: 二进制0b 十进制 八进制 ...

  6. SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程01---搭建前端工程

    豆宝社区项目实战教程简介 本项目实战教程配有免费视频教程,配套代码完全开源.手把手从零开始搭建一个目前应用最广泛的Springboot+Vue前后端分离多用户社区项目.本项目难度适中,为便于大家学习, ...

  7. Python安装教程

    1.下载好Python安装包后,双击打开(第一个是32位,第二个是64位,根据自己电脑位数进行选择): 2.打开后如下,先将下方的Python添加到系统环境变量勾选上,再点击第一个默认安装即可: 3. ...

  8. 将项目加载到tomcat中的时候报错:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules

    转自:http://jingwang0523.blog.163.com/blog/static/9090710320113294551497/ 最近在用eclipse做项目,新建项目时什么都贪新,用最 ...

  9. 换人!golang面试官:连怎么避免内存逃逸都不知道?

    问题 怎么避免内存逃逸? 怎么答 在runtime/stubs.go:133有个函数叫noescape.noescape可以在逃逸分析中隐藏一个指针.让这个指针在逃逸分析中不会被检测为逃逸. // n ...

  10. oracle 19c 导入 12c ORA-39002 ORA-39358

    直接用19c导出的dmp文件导入到12c,报错: ORA-39002: invalid operation ORA-39358: Export dump file version 19.0.0.0.0 ...