拖拽式Vue组件代码生成平台(LCG)新版详细介绍

拖拽式Vue组件代码生成平台是一款小猴自研的Vue代码生成工具,英文全称:Low Code Generator,简称LCG。它也是一种LowCode解决方案。通过它可以快速完成Vue组件的代码骨架搭建,通过减少不必要的重复工作从而带来开发效率的提升。

体验地址:https://vcc.surge.sh/
项目地址:https://github.com/sahadev/vue-component-creater-ui

出现的背景

做前端久了就难免会发现有一些工作其实是繁复的,它们有一些共同的特点:

  • 频率高
  • 非常基础
  • 花费时间

而有一部分工作是可以通过技术手段解决的,例如在写Vue时会发现:

  • class的名称需要分别在template和style中定义。
  • v-on,v-bind,v-model,v-for等指令的值需要分别在template和script中定义。
  • 强烈依赖第三方组件库的需要打开官网拷贝某个组件所对应的代码。

上面三种场景占用了开发一个组件所需要使用的相当一部分时间。尤其是第三条,经常就是打开官网 -> 找到组件 -> 拷贝template -> 拷贝data -> 拷贝method -> 验证效果。如果遇到复杂组件时就不知不觉花了不少时间进去。而第一条也需要我们来回在上下文中定义class-name。而这些常见的基本操作如果可以将它们的共性提取出来,那么我们就有办法通过技术手段大幅缩短这部分时间。这就为LCG的出现提供了需求背景。

作者之前是写Android的,对Android的拖拽式布局印象很深刻。因为拖拽本身所需要花费的时间是所有编码操作中最少的。

所以想法一结合,诞生了LCG。

使用它可以完成什么

目前LCG集成了HTML5的基本元素以及Element UI常见的平面组件,所以目前可以通过LCG完成常见的表格与表单。这里列举一些具有代表性的页面:

LCG同样支持搭建移动端的页面,只需要将相应的组件库集成即可。

快速生成一个这样的查询表格:

<template><div><el-form inline :model="formInline" class="demo-form-inline"><el-form-item label="审批人"><el-input v-model="formInline.user" placeholder="审批人"></el-input></el-form-item><el-form-item label="活动区域"><el-select v-model="formInline.region" placeholder="活动区域"><el-option label="区域一" value="shanghai"></el-option><el-option label="区域二" value="beijing"></el-option></el-select></el-form-item><el-button type="primary" @click="onQueryButtonClick" size="small">查询</el-button><el-button @click="onResetButtonClick" size="small">重置</el-button></el-form><el-button type="primary" @click="onCreateButtonClick" size="small">新增</el-button><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="日期" width="180"></el-table-column><el-table-column prop="name" label="姓名" width="180"></el-table-column><el-table-column prop="address" label="地址"></el-table-column></el-table><el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage":page-sizes="[10, 20, 50, 100]" :page-size="10" layout="total, sizes, prev, pager, next, jumper" :total="234"></el-pagination></div>
</template><script>
export default {props: [],components: {},data() {return {// 在此自动生成currentPage: 1,formInline: {user: "",region: ""},tableData: [{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄"},{date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄"},{date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄"},{date: "2016-05-03",name: "王小虎",address: "上海市普陀区金沙江路 1516 弄"}]};},watch: {},computed: {},beforeCreate() { },created() { },beforeMount() { },mounted() { },beforeUpdate() { },updated() { },destoried() { },methods: {// 在此自动生成request() {// 网络请求,可选},handleCurrentChange() { },handleSizeChange() { },onButtonClick() { },onCreateButtonClick() { },onQueryButtonClick() { },onResetButtonClick() { }},fillter: {},
};
</script><style scoped>
/*  在此自动生成 */
.demo-form-inline {
}
</style>

也可以快速搭建一个这样的数据提交表单:

<template><div><el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-border"><el-form-item label="活动名称" prop="name"><el-input v-model="ruleForm.name"></el-input></el-form-item><el-form-item label="活动区域" prop="region"><el-select v-model="ruleForm.region" placeholder="请选择活动区域"><el-option label="区域一" value="shanghai"></el-option><el-option label="区域二" value="beijing"></el-option></el-select></el-form-item><el-form-item label="文件上传" prop="delivery"><el-upload class="upload-demo" drag action="https://jsonplaceholder.typicode.com/posts/" multiple><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或 <em> 点击上传 </em></div><div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div></el-upload></el-form-item><el-form-item label="特殊资源" prop="resource"><el-radio-group v-model="ruleForm.resource"><el-radio label="线上品牌商赞助"></el-radio><el-radio label="线下场地免费"></el-radio><el-radio label="线上推广"></el-radio></el-radio-group></el-form-item><el-form-item label="活动形式" prop="desc"><el-input type="textarea" v-model="ruleForm.desc"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm">立即创建</el-button><el-button @click="resetForm">重置</el-button></el-form-item></el-form></div>
</template><script>
export default {props: [],components: {},data() {return {// 在此自动生成ruleForm: {name: "",region: "",date1: "",date2: "",delivery: false,type: [],resource: "",desc: ""},rules: {name: [{required: true,message: "请输入活动名称",trigger: "blur"},{min: 3,max: 5,message: "长度在 3 到 5 个字符",trigger: "blur"}],region: [{required: true,message: "请选择活动区域",trigger: "change"}],date1: [{type: "date",required: true,message: "请选择日期",trigger: "change"}],date2: [{type: "date",required: true,message: "请选择时间",trigger: "change"}],type: [{type: "array",required: true,message: "请至少选择一个活动性质",trigger: "change"}],resource: [{required: true,message: "请选择活动资源",trigger: "change"}],desc: [{required: true,message: "请填写活动形式",trigger: "blur"}]}};},watch: {},computed: {},beforeCreate() { },created() { },beforeMount() { },mounted() { },beforeUpdate() { },updated() { },destoried() { },methods: {// 在此自动生成request() {// 网络请求,可选},goBack() { },resetForm() { },submitForm() { }},fillter: {},
};
</script><style scoped>
/*  在此自动生成 */
.demo-border {
}
.el-icon--right {
}
.el-icon-upload {
}
.el-upload__text {
}
.el-upload__tip {
}
.line {
}
.upload-demo {
}
</style>

当然,搭建成为什么样的页面完全取决于开发者,上面两张图只是一个效果示意。LCG的主要能力在于它所生成的代码。

LCG会自动将各个组件按照SFC文件的结构拼接在一起,并且会把data、method、class的声明也创建好。有了这样一个骨架结构,开发者便可以将代码下载至项目目录,在此基础上进行二次开发。

这个骨架创建过程完全不需要打开Element UI官网进行一个个组件代码拷贝这样繁复的过程,只需拖拽几下就搞定了。

使用它可以带来的收益

虽然带来了很明显的效率提升效果,但还是需要一个数据来表达一下究竟可以节约多少时间。

还是以上面的查询表格为例。作者分别通过常规的方式和通过LCG的方式做一下数据比对。

视频链接:https://www.bilibili.com/video/BV1Ca4y1n7US

通过以上视频可以看到,LCG总共用时99秒,而常规方式总共用时205秒。因此LCG相比较常规方式提效至少在100%以上,因为LCG不要起本地服务就可以看到实时效果。两者的时间差值随着组件的复杂度增加而增加。

视频介绍

下面是一个基本版的视频介绍:

视频链接:https://www.bilibili.com/video/BV17h411f7g2

基本原理

我们知道,在编写后的 vue 代码在运行时会生成实际的 Html 代码,而组件生成平台的职责是将这些 Html 再转换为 vue 代码,并组合在一起。

为了达到这样的目的,我们目前采用的思路是:将原始的代码文件进行预编译:对指定的vue组件分配一个随机 ID,并将这个vue文件的代码结构转换为以JavaScript对象表示的结构,以ID: Structure的形式存储于 JS文件中。在运行时,将此JS文件加载进内存。当拖动某个被lc-mark标记的元素时,我们可获得这个元素相应的ID,再通过这个ID查找对应的Structure。当拖入到某个元素中时,也通过相同的方式获得目标元素的原始代码,再将这两部分原始代码合并,并建立上下级关系。随后,通过新的代码结构,分析对应的@click、v-model、class等我们所关注的属性,然后再将其生成对应的代码插入到将要生成的Vue组件模板中。至此,便形成了一个较为完整的Vue组件代码。

现有的能力

可以从以下几个点来描述LCG现有的能力:

  • 组件库:目前LCG集成了常用的Html5元素以及Element UI大部分组件。

  • 组合形式:目前支持将一个组件插入到另一个组件的前面、里面、后面。

  • 生成结果:目前除了支持自动提取class之外还支持自动生成template中通过以下指令所声明的data以及method(包括但不限于):

    • v-bind或:
    • v-for
    • v-if
    • v-model
    • v-on或@
    • {{ Mustache }}
  • 属性预置:由于每个组件的属性繁多,无法将每种组合的组件都预置完全,所以有一部分组件预置了属性。比如el-pagination,它在组件库中是通过基础用法表示的,而当被拖入到操作区域后,它在预览区域展示的是完整功能。这是因为它被拖入后增加了一些预置属性。如果你不要它,则可以在属性编辑时将这些预置属性删除。

  • 兄弟组件快速复制:有一些组件在使用时的个数是不确定的,比如el-radio、el-checkbox等,所以LCG提供了兄弟组件快速复制的能力。当把鼠标移动至这类组件上时,就会出现一个小加号(➕),然后点击这个加号边可以快速复制一个兄弟组件。支持复制兄弟组件的组件有:

    • el-checkbox
    • el-radio
    • el-option (在检视图中复制)
    • el-table-column (在检视图中复制)
  • 代码结构检视:有一些脱离文档流的组件是无法直接在操作区域看到的,比如el-option这种下拉选项。所以LCG提供了结构检视图的能力。通过结构检视图可以看到template中各个组件结构的层级关系。并且也可以对el-option这种看不到的组件进行属性编辑。在结构检视图中除了可以编辑组件的基本属性外,还可以对el-option、el-table-column这些组件进行兄弟组件复制。但需要注意的是:在这种模式下不支持删除组件

特点

可以说LCG的特点是:

  • 组件库强大,支持各类Vue组件库。
  • 组合形式多样,支持各种组合。
  • 生成结果丰富,支持无限扩展各种指令以及v-bind、v-on。

做不到哪些以及需要注意的

因为实现机制的原因,有一些是目前LCG无法做到的:

  • 操作区域效果同步更新。这里是指如果编辑的是一个Html5元素的话,那么操作区域以及实时预览区域的效果都会更新。但如果是复杂的组件(实现层级超过两级),则只能在预览区域看到效果。
  • 无法组合非平面组件的结构。以Dialog举例,因为Dialog本身不是文档流的一部分,所以在对Dialog进行结构表示时获取不到本身的DOM结构,所以无法直接将内部的内容放入到Dialog中。而是需要将内容放置到Dialog前面或者后面,然后再在本地编辑器中调整其正确的结构。
  • 某些组件无法选中。部分组件因为实现逻辑的原因,没有将id属性挂载到组件的根节点上,所以会导致在操作区域点击这个组件出现无法选中的现象。这种情况可通过组件检视图更新该组件的属性。目前已知有这种现象的组件有:el-switch、el-time-select。

没有集成的ElementUI组件

  • Divider 分割线
  • InfiniteScroll 无限滚动
  • Notification 通知
  • MessageBox 弹框
  • Message 消息提示
  • Loading 加载
  • Backtop 回到顶部

联系我们

如果您对LCG有任何的想法与建议,可以通过邮件联系:sahadev@foxmail.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory

apt-get update apt-get install libglib2.0-dev系统&#xff1a;ubuntu16.04

LeetCode 454. 四数相加 II(哈希)

1. 题目 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化&#xff0c;所有的 A, B, C, D 具有相同的长度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间…

论文浅尝 - AAAI2020 | 多轮对话系统中的历史自适应知识融合机制

论文笔记整理&#xff1a;潘锐&#xff0c;天津大学硕士。链接&#xff1a;https://www.aaai.org/ojs/index.php/AAAI/article/view/6425来 源&#xff1a;AAAI 2020论文简介保持对话的一致性和避免内容重复是构建以知识为基础的多轮对话系统的两个关键因素。尽管一些工作倾…

高性能平台设计—美团旅行结算平台实践

本文根据第23期美团技术沙龙演讲内容整理而成。 背景 美团酒旅有很多条业务线&#xff0c;例如酒店、门票、火车票等等&#xff0c;每种业务都有结算诉求&#xff0c;而结算处于整个交易的最后一环不可缺少&#xff0c;因此我们将结算平台化&#xff0c;来满足业务的结算诉求。…

小程序调试技术导读

近期团队内在自研小程序&#xff0c;我负责开发者工具中的调试部分。调试作为面向开发者的基础能力&#xff0c;扮演了极为重要的角色。 本篇文章是导读文章。 调试能力从0到1一共经历了4个版本&#xff0c;接下来的文章将会以这4个版本为主线分别进行介绍。 初始版 上图为调试…

可交互的 Attention 可视化工具!我的Transformer可解释性有救了?

文 | Sherry视觉是人和动物最重要的感觉&#xff0c;至少有80%以上的外界信息是经过视觉获得的。我们看论文的时候&#xff0c;通过图表来确定文章的大致内容往往也是一个更高效的 说到深度神经网络的可视化&#xff0c;最经典的莫过于的CNN密恐图了&#xff1a;这种可视化方法…

ImportError: libSM.so.6: cannot open shared object file: No such file or dir

ImportError: libSM.so.6: cannot open shared object file: No such file or dir 出现错误&#xff1a; ImportError: libSM.so.6: cannot open shared object file: No such file or dir 解决方法&#xff1a; apt-get install libsm6如果你出现了上面的错误&#xff0c;那…

LeetCode 347. 前 K 个高频元素(哈希/优先队列)

文章目录1. 题目2. 解题2.1 哈希2.2 优先队列1. 题目 给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] 说明&#xff1a; 你可以假设给定的 k 总是合理的&…

Lego-美团接口自动化测试实践

一、概述 1.1 接口自动化概述 众所周知&#xff0c;接口自动化测试有着如下特点&#xff1a; 低投入&#xff0c;高产出。比较容易实现自动化。和UI自动化测试相比更加稳定。如何做好一个接口自动化测试项目呢&#xff1f; 我认为&#xff0c;一个“好的”自动化测试项目&#…

小程序调试技术详解(基于小猴小程序)

本篇文章主要围绕小猴小程序调试技术第三版进行展开。 在上一篇导读文章中提到&#xff0c;小猴小程序的调试部分从无到有一共经历了3个版本。本篇文章会详细描述面向开发者的调试功能是如何实现的。 文章将会描述以下部分&#xff1a; 调试实现的基本通信关系结构。如何实现…

论文浅尝 - CIKM2020 | 用于推荐系统的多模态知识图谱

论文笔记整理&#xff1a;王琰&#xff0c;东南大学硕士。来源&#xff1a;CIKM 2020链接&#xff1a;https://doi.org/10.1145/3340531.3411947研究背景与任务描述为了解决推荐系统中的数据稀疏和冷启动问题&#xff0c;研究人员通过利用有价值的外部知识作为辅助信息&#xf…

FedNLP: 首个联邦学习赋能NLP的开源框架,NLP迈向分布式新时代

文 | 阿毅两周前&#xff0c;南加大Yuchen Lin&#xff08;PhD student USC and ex-research intern GoogleAI)所在的团队在Twitter官宣开源首个以研究为导向的联邦学习赋能NLP的FedNLP框架。发布数小时内就获得了647个赞&#xff0c;163次转发&#xff0c;可见其热度。我相信大…

LeetCode 380. 常数时间插入、删除和获取随机元素(哈希+vector)

1. 题目 设计一个支持在平均 时间复杂度 O(1) 下&#xff0c;执行以下操作的数据结构。 insert(val)&#xff1a;当元素 val 不存在时&#xff0c;向集合中插入该项。 remove(val)&#xff1a;元素 val 存在时&#xff0c;从集合中移除该项。 getRandom&#xff1a;随机返回现…

论文浅尝 - ICLR2020 | 知识图谱中数值规则的可微学习

论文笔记整理&#xff1a;许泽众&#xff0c;浙江大学博士研究生。研究方向&#xff1a;知识图谱&#xff0c;规则挖掘等。论文链接&#xff1a;https://openreview.net/pdf?idrJleKgrKwS本文解决的是规则的学习问题&#xff0c;学习出来的规则可用于知识推理任务&#xff0c;…

2021大厂面试高频100题最新汇总(附答案详解)

昨天在知乎上刷到一个热门问题:程序员需要达到什么水平才能顺利拿到 20k 无压力&#xff1f;其中一个最热门的回答是&#xff1a;“其实&#xff0c;无论你是前端还是后端、想进大厂还是拿高薪&#xff0c;算法都一定很重要。”为什么&#xff0c;算法会如此重要&#xff1f;不…

LeetCode 33. 搜索旋转排序数组(二分查找)

1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如&#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值&#xff0c;如果数组中存在这个目标值&#xff0c;则返回它的索引&#xff0c;否则返回 -1 。 你可以假设数…

论文浅尝 - EMNLP2020 | 低资源跨语言实体链接中的设计挑战

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;EMNLP 2020链接&#xff1a;https://arxiv.org/pdf/2005.00692.pdf1.背景介绍跨语言实体链接&#xff08;XEL&#xff09;旨在将任一非英语文本中的实体提及匹配到英语知识库上&#xff08;例如Wikip…

MSON,让JSON序列化更快

问题 我们经常需要在主线程中读取一些配置文件或者缓存数据&#xff0c;最常用的结构化存储数据的方式就是将对象序列化为JSON字符串保存起来&#xff0c;这种方式特别简单而且可以和SharedPrefrence配合使用&#xff0c;因此应用广泛。但是目前用到的Gson在序列化JSON时很慢&a…

屠榜各大CV任务!「百度顶会论文复现营」携Swin Transformer来袭!

目标检测刷到58.7 AP&#xff01;实例分割刷到51.1 Mask AP&#xff01;&#xff01;语义分割在ADE20K上刷到53.5 mIoU&#xff01;&#xff01;&#xff01;......Swin Transformer持续屠榜各大CV任务&#xff0c;并且均名列前茅&#xff01;通过分层体系结构&#xff0c;带来…