用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;定义复杂的缓存…

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

主要用于配置主机属性的自动应用。当主机发生模块转移或模块新加入主机时&#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;是主机请求设备应用程序生成的数…

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

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

Linux-基础IO

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

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

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

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …

接口文档不显示新写的接口

新写的接口&#xff0c;但是不显示&#xff1a; 仔细对比源码才发现没有写tag&#xff1a; 然后就有了&#xff1a;

ES6之正则扩展

正则表达式扩展 u修饰符&#xff08;Unicode模式&#xff09;y修饰符&#xff08;Sticky或粘连模式&#xff09;s修饰符&#xff08;dotAll模式&#xff09;Unicode属性转义正则实例的flags属性字符串方法与正则表达式的整合 javascript的常用的正则表达式 验证数字邮箱验证手机…

C语言中的循环队列与栈、队列之间的转换实现

引言 在数据结构的学习中&#xff0c;栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两个非常重要的概念。它们分别遵循着后进先出&#xff08;LIFO&#xff09;和先进先出&#xff08;FIFO&#xff09;的原则。在某些情况下&#xff0c;我们可能需要…

C++——超简单登录项目

程序入口文件 #include <QtWidgets/QApplication> // 包含登录页面头文件 #include "DlgLogin.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 程序入口// 调页面起来//DlgMain w;//w.show();// 换成登录页面DlgLogin w;w.show();return…

开源禅道zentao的使用

很不幸禅道因为漏洞被人进攻了&#xff0c;被迫研究。 1.安装 直接使用docker进行部署&#xff0c;这里有非常多门道。官网的镜像easysoft-zentao是属于docker安装&#xff0c;而idoop的镜像虽然也是docker安装&#xff0c;但是实际是使用官网linux一键安装的版本&#xff0c…

一周学习总结:数组与链表

学习内容&#xff1a;数组与链表、计算机网络知识 数组&#xff1a; 从数组的基础知识到相关应用 数组的基础知识&#xff1a;数组在内存中的存储、数组的相关操作&#xff08;获取与更新&#xff09;、数组的相关应用&#xff1a; 二分查找法⭐⭐⭐⭐⭐ ● 掌握左闭右闭的…

2024第16届四川教育后勤装备展6月1日举办 欢迎参观

2024第16届四川教育后勤装备展6月1日举办 欢迎参观 邀请函 主办单位&#xff1a; 中国西部教体融合博览会组委会 承办单位&#xff1a;重庆港华展览有限公司 博览会主题&#xff1a;责任教育 科教兴邦 组委会&#xff1a;交易会159交易会2351交易会9466 展会背景 成都…