前一阵子拜访了一些小伙伴,大家都表示苦前端太久了,需要花费不少时间在前端开发上。本着在不损失灵活性的前提下尽可能提高开发效率的原则,作者尝试在框架内集成了拖拽方式生成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. MBP 屏幕分辨率 All In One

    MBP 屏幕分辨率 All In One screen size bug https://stackoverflow.com/questions/65462643/how-to-get-the-rea ...

  2. 使用 js 实现十大排序算法: 希尔排序

    使用 js 实现十大排序算法: 希尔排序 希尔排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  3. prefetch & preload & prerender & dns-prefetch & preconnect

    prefetch & preload & prerender & dns-prefetch & preconnect performance optimization ...

  4. github & gist & Weekly development breakdown

    github & gist & Weekly development breakdown https://gist.github.com/xgqfrms WakaTime waka-b ...

  5. flex & flex-wrap

    flex & flex-wrap https://css-tricks.com/almanac/properties/f/flex-wrap/ https://developer.mozill ...

  6. 「NGK每日快讯」12.17日NGK第44期官方快讯!

  7. 快速读懂 HTTP/3 协议

    在 深入浅出:HTTP/2 一文中详细介绍了 HTTP/2 新的特性,比如头部压缩.二进制分帧.虚拟的"流"与多路复用,性能方面比 HTTP/1 有了很大的提升.与所有性能优化过程 ...

  8. 基本的DOS命令

    基本的DOS命令 打开CMD的方法 菜单+系统+命令提示符 WIN+R后输入CMD 桌面或文件夹任意位置按住SHIFT后鼠标右键 常见的DOS命令 #盘符切换 直接输入要切换的盘符名称 如输入&quo ...

  9. InnoDB -- 行记录格式

    本文转载自InnoDB -- 行记录格式 分类 Named File Format InnoDB早期的文件格式(页格式)为Antelope,可以定义两种行记录格式,分别是Compact和Redunda ...

  10. fixed实现遮罩层,小程序

    css /** 分享微信,分享朋友圈 **/ .goods_share_mask { background-color: rgba(0, 0, 0, 0.3); position: fixed; to ...