用vue实现json模版编辑器

用vue实现json模版编辑器

  • 控件区
  • 表单区
  • 配置项区 (还没写)
  • 业务逻辑

设想业务逻辑是拖拽控件生成表单 动手做了一个简单的demo 业务的原型图设想如下所示
其中使用的技术主要是vuedragger
在这里插入图片描述

控件区

做控件区的时候首先我们要有确定的配置项 其实也很简单 就是 把所有的选项罗列开来能够正常显示就行了
如图所示 可以去换成图标 什么的 但是是做demo 没有细节所以比较丑陋 后面的也是 将就看吧嘻嘻
在这里插入图片描述
配置项如下代码所示:(这一部分还是要看自己具体的业务逻辑)

 [{type: 'image',name: '上传照片',updata_data: []},{type: 'radio-multi',values: ['option1', 'option2', 'option3'],name: '多选选择',updata_data: []},{type: 'radio-single',values: ['是', '否'],name: '单选选择',updata_data: ''},{type: 'text',name: '文本输入',updata_data: ''}],

表单区

表单区用border做了一个丑丑的类似手机的边框 如下图所示
在这里插入图片描述

配置项区 (还没写)

业务逻辑

如上两张图 我们已经有了控件区和表单区,现在要处理拖拽事件 我们的页面逻辑为 1左边到右边为复制 2右边不可到左边 3左边不可排序 4右边生成的表单内容可以进行排序
实现这个业务逻辑主要使用了vuedraggable 这个库,这是一个很好用的Js拖拽库
任务点1和3可以通过定义一个不被修改的配置项 控件区的end自定义事件里 替换绑定值实现
任务点2 通过配置拖拽组的时候另外加配置项实现
任务点4 插件本身支持这个功能
业务分析完毕
当前完整代码如下:

<template><div class="TemplateEditor-container"><div class="btn-list"><draggable :group="grpupA" :animation="50" key="optionList" v-model="optionList" :move="onmove" @end="end1"><transition-group style="min-height:600px;display: block;"><div v-for="(item, idx) in optionList" :key="idx" class="btn">{{ item.type }}</div></transition-group></draggable></div><div class="phonelist-con"><div class="phonelist"><draggable group="site" :animation="50" key="ttt" v-model="ttt"><transition-group style="min-height:600px;display: block;"><div v-for="(item, idx) in ttt" :key="idx" class="phoneinner" @dblclick="changejson"><div v-if="item.type == 'text'"><div class="labletit" :class="item.required ? 'requiredval' : ''">{{ item.name }}</div><el-input class="info" type="textarea" :autosize="{ minRows: 4 }":placeholder="item.hint" disabled></el-input></div><div v-if="item.type == 'image'"><div class="labletit" :class="item.required ? 'requiredval' : ''">{{ item.name }}</div><div class="imgbox"><div class="inputbox"><i class="ri-camera-fill"></i><span>点击上传图片</span></div></div></div><div v-if="item.type == 'radio-multi'"><div class="labletit" :class="item.required ? 'requiredval' : ''">{{ item.name }}</div><el-checkbox-group v-model="item.updata_data"><el-checkbox disabled v-for="inner in item.values" :label="inner" :key="inner">{{inner }}</el-checkbox></el-checkbox-group></div><div v-if="item.type == 'radio-single'"><div class="labletit" :class="item.required ? 'requiredval' : ''">{{ item.name }}</div><el-radio-group><el-radio disabled v-for="(innerite, idx) in item.values" :key="idx":label="innerite">{{innerite }}</el-radio></el-radio-group></div></div></transition-group></draggable></div></div><div class="json"></div></div>
</template><script>
import draggable from 'vuedraggable'
export default {components: {draggable},data() {return {grpupA: {name: 'site',pull: true,put: false},ttt: [],tempoptions: [{type: 'image',name: '上传照片',updata_data: []},{type: 'radio-multi',values: ['option1', 'option2', 'option3'],name: '多选选择',updata_data: []},{type: 'radio-single',values: ['是', '否'],name: '单选选择',updata_data: ''},{type: 'text',name: '文本输入',updata_data: ''}],optionList: [{type: 'image',name: '上传照片'},{type: 'radio-multi',values: ['option1', 'option2', 'option3'],name: '多选选择'},{type: 'radio-single',values: ['是', '否'],name: '单选选择'},{type: 'text',name: '文本输入'}]}},methods: {changejson(){},onmove() {//return false},end1(e) {console.log(e, '111')this.optionList = this.tempoptions},}}
</script><style lang="scss" scoped>
.inputbox {width: 100%;height: 4.125rem;line-height: unset;background-color: #F2F6F8;border-radius: 6px;border-color: #f2f6f8;display: flex;flex-direction: column;align-items: center;justify-content: center;position: relative;box-sizing: border-box;i {font-size: 24px;color: #4E5969;}span {font-weight: 400;font-size: 12px;color: #86909C;}
}.TemplateEditor-container {border: 2px solid #333;width: 100vw;height: 100vh;box-sizing: border-box;display: flex;align-items: center;.btn-list {width: 10%;height: 60vh;//padding: 20%;box-sizing: border-box;.btn {display: block;padding: 10px 20px;margin-left: 10px;margin-top: 10px;border: 1px solid #333;}}.phonelist-con {height: 80vh;width: 375px;padding-left: 20px;.phonelist {max-height: 80vh;overflow: auto;border: 10px solid #333;border-top-width: 120px;border-bottom-width: 100px;box-sizing: border-box;border-radius: 40px;.phoneinner {width: 100%;margin-bottom: 10px;padding: 2px 10px;box-sizing: border-box;}}}.json{flex: 1;height: 80vh;margin-left: 10px;margin-right: 10px;border:1px solid #d8d8d8;}.labletit {color: #888;font-size: 14px;padding-top: 10px;padding-bottom: 4px;}.requiredval {position: relative;width: auto;}.requiredval::after {right: -6px;top: 0px;padding-left: 4px;content: "*";color: #f56c6c;margin-right: 4px;}
}
</style>

实现效果如下图所示:
在这里插入图片描述

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

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

相关文章

Github20K星开源团队协作工具:Zulip

Zulip&#xff1a;让团队协作的每一次交流&#xff0c;都精准高效。- 精选真开源&#xff0c;释放新价值。 概览 随着远程工作的兴起和团队协作的需求不断增加&#xff0c;群组聊天软件成为了日常工作中不可或缺的一部分。Zulip 是github上一个开源的团队协作工具&#xff0c;…

SpringBoot:缓存

点击查看SpringBoot缓存demo&#xff1a;LearnSpringBoot09Cache-Redis 技术摘要 注解版的 mybatisCacheConfigCacheableCachePut&#xff1a;既调用方法&#xff0c;又更新缓存数据&#xff1b;同步更新缓存CacheEvict&#xff1a;缓存清除Caching&#xff1a;定义复杂的缓存…

Java 和 C++ 的区别

在面试中&#xff0c;经常会被问到Java和C的区别&#xff0c;即使你没有学过C&#xff0c;也需要对这些区别有所了解。虽然Java和C都是面向对象的编程语言&#xff0c;都支持封装、继承和多态&#xff0c;但它们之间仍然存在许多重要的不同点。以下是一些关键的区别&#xff0c…

图的拓扑序列(BFS_如果节点带着入度信息)

way&#xff1a;找入度为0的节点删除&#xff0c;减少其他节点的入度&#xff0c;继续找入度为0的节点&#xff0c;直到删除完所有的图节点。&#xff08;遍历node的neighbors就能得到neighbors的入度信息&#xff09; #include<iostream> #include<vector> #incl…

【运维自动化-配置平台】如何自动应用主机属性

主要用于配置主机属性的自动应用。当主机发生模块转移或模块新加入主机时&#xff0c;会根据目标模块配置的策略自动触发修改主机属性&#xff0c;比如主机负责人、主机状态。主机属性自动应用顾名思义是应用到主机上&#xff0c;而主机是必须在模块下的&#xff0c;所以有两种…

net 7部署到Linux并开启https

1.修改代码设置后台服务运行 安装nuget包 Install-Package Microsoft.Extensions.Hosting.WindowsServices Install-Package Microsoft.Extensions.Hosting.Systemd在Program代码中设置服务后台运行 var builder WebApplication.CreateBuilder(args);if (System.OperatingS…

【QuikGraph】C#调用第三方库计算有向图、无向图的连通分量

QuikGraph库 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph 相关概念 图论、连通分量、强连通分量相关概念&#xff0c;可以从其他博客中复习&#xff1a; https://blog.csdn.net/weixin_50564032/article/details/123289611 https://zhuanlan.zhihu.com/p/3…

【LeetCode刷题】136.只出现一次的数字(Ⅰ)

【LeetCode刷题】136.只出现一次的数字&#xff08;Ⅰ&#xff09; 1. 题目&#xff1a;2.思路分析&#xff1a;思路1&#xff1a;一眼异或&#xff01; 1. 题目&#xff1a; 2.思路分析&#xff1a; 思路1&#xff1a;一眼异或&#xff01; 看到题目&#xff0c;如果有一定基…

Kafka学习-Java使用Kafka

文章目录 前言一、Kafka1、什么是消息队列offset 2、高性能topicpartition 3、高扩展broker 4、高可用replicas、leader、follower 5、持久化和过期策略6、消费者组7、Zookeeper8、架构图 二、安装Zookeeper三、安装Kafka四、Java中使用Kafka1、引入依赖2、生产者3、消费者4、运…

JavaScript异步编程——09-Promise类的方法【万字长文,感谢支持】

Promise 类的方法简介 Promise 的 API 分为两种&#xff1a; Promise 实例的方法&#xff08;也称为&#xff1a;Promis的实例方法&#xff09; Promise 类的方法&#xff08;也称为&#xff1a;Promise的静态方法&#xff09; 前面几篇文章&#xff0c;讲的都是 Promise 实…

USB3.0接口——(3)协议层(包格式)

1.协议层 1.1.超高速传输事务 超高速事务&#xff08;SuperSpeed transactions&#xff09;由主机对设备端点请求或发送数据开始&#xff0c;并在端点发送数据或确认收到数据时完成。 超高速总线上的数据传输&#xff08;transfer&#xff09;是主机请求设备应用程序生成的数…

记element-ui树形控件懒加载实现

概要 如何通过vue2element-ui实现树形控件的懒加载 整体架构流程 1.树形控件的组件代码 <el-tree:data"treeData":props"defaultProps":load"load"lazycurrent-change"handleNodeClick":expand-on-click-node"true":h…

【LAMMPS学习】九、LAMMPS脚本 示例

9. 示例脚本 LAMMPS 发行版包含一个包含许多示例问题的示例子目录。许多是二维模型&#xff0c;运行速度快且易于可视化&#xff0c;在台式机上运行最多需要几分钟。每个问题都有一个输入脚本 (in.*)&#xff0c;并在运行时生成一个日志文件 (log.*)。有些使用初始坐标的数据文…

课时125:awk实践_进阶知识_匹配运算

1.2.4 匹配运算 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 所谓的匹配运算&#xff0c;主要指的是关键字无法精确性的匹配相关信息了&#xff0c;但是我们可以结合一些关键字信息进行模糊的匹配。对于匹配运算来说&#x…

streamlit报错:AxiosError: Request failed with status code 403

解决办法&#xff1a; 步骤一&#xff1a;创建config.toml vi ~/.streamlit/config.toml 步骤二&#xff1a;加入以下内容 [server] enableXsrfProtection false enableCORS false步骤三&#xff1a;重新启动你的streamlit网页

排程过程中任务锁定的外延与内涵

在生产排程过程中&#xff0c;除了可以借助强大的算法&#xff0c;与优质的规划模型对待排任务进行排产优化外&#xff0c;还会遇到一些需要人为锁定部分任务的情况。无论是APS系统开发人员&#xff0c;还是排产作业人员&#xff0c;在常见的认识中&#xff0c;对于“锁定”概念…

windows C++:进程间通信高实时性、安全、数据量大的通信方式(一)文件映射 (File Mapping)

windows进程间通信是写多进程程序的必修课&#xff0c;高实时性、安全、数据量大的通信方式是很必要的&#xff0c;今天我们来看看文件映射 一、文件映射 (File Mapping) 1. 简单的介绍 文件映射通过将文件的部分或全部内容映射到一个或多个进程的虚拟地址空间&#xff0c;使…

Linux-基础IO

&#x1f30e;Linux基础IO 文章目录&#xff1a; Linux基础IO C语言中IO交互       常用C接口         fopen         fputs         fwrite         fgets 当前路径       三个文件流 系统文件IO       open函数     …

什么是Wi-Fi保护设置(WPS),以及如何使用它?这里有详细解释

生活在现代世界的双刃剑是,一切都可以无线连接,但这往往会让我们更容易受到攻击。WPS可以帮助你减轻这种风险,而不需要你精通技术,只需简单地按下路由器上的按钮。 什么是Wi-Fi保护设置(WPS) 当你不想手动连接时,路由器上的WPS按钮是一种连接无线设备的简单方法。它使…

特征模态分解(FMD):一种小众而又新颖的分解方法

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天为大家介绍一个小众而又新颖的信号分…