低代码开发之vue.draggable的使用(进阶:组件化拖拽生成功能页面)

这篇具有很好参考价值的文章主要介绍了低代码开发之vue.draggable的使用(进阶:组件化拖拽生成功能页面)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果展示:

网页 通过拖拽组件配置页面,前端,低代码,vue.js
前言:随着各公司定制化需求的不断攀升,公司对低代码、组态化的开发需求日渐迫切。也许是研发任务节点将至,也许是为顺应时代潮流,我也是去学习并实践了一番。如图所示。

功能简介:

左侧组件区域特意做了选中态,小眼睛预览浮框态等交互,右侧内容区域支持增加、删除、退出、重置、预览 、保存、应用等操作,以及组态化最重要的功能点–随意拖拽换位,后期考虑增加属性面板支持对拖拽进来的组件进行宽高、颜色等的二次编辑修饰。

具体实现:
1、实现流程依据

通过json实现,预先定义好描述组件的json,json包含了当前组件数据和当前组件的样式属性数据等,并通过组件生成器将将描述组件的json结合起来渲染出实际组件,当修改样式属性时,组件样式同步更新;

示例json:

json:{
  fieldid:"",
  name:"Input",
  label:"单行文本",
  icon:"input01",
  placeholder:"请输入",
  value:"",
  rules:{},
  style:{},//组件的样式
  setting:{},//组件的其他属性,比如:row:2

实现原理思维导图:
网页 通过拖拽组件配置页面,前端,低代码,vue.js

2、实现详情介绍

此需求基于开源的vue.draggable ^2.24.3,Vue项目首先需要去npm i -S vuedraggable下载vue.draggable相关依赖,并导入注册draggable组件。如果是原生js直接CDN形式引用vuedraggable压缩文件即可。建议没看过我初阶版本博客的小伙伴去看一下上篇文章再来,沿袭上篇代码还是分组件区跟内容区两个group,group要名称一致才可以建立拖拽关系,那么假设我们内容区域group起名module,那么组件内区域应该也命module,结合展开面板组件使用那么json结构如下:

componentsList:[
	{
		key: "1",
		name: "顶部指标栏",
		group: { name: "module", pull: "clone", put: false },
		child: [
			{
				id: 1,
				type: 0,
				col: 24,
				name: "默认样式",
				imgSrc: "TopIndicator",
				componentName: "TopIndicator",
				activeKey: true
			},
			{
				id: 2,
				type: 1,
				col: 24,
				name: "样式一",
				imgSrc: "TopIndicatorOne",
				componentName: "TopIndicator",
				activeKey: false
			},
			{
				id: 3,
				type: 2,
				col: 24,
				name: "样式二",
				imgSrc: "TopIndicatorTwo",
				componentName: "TopIndicator",
				activeKey: false
			}
		]
	},
    ......
]

组件区域代码

<div class="left-components beautify-scroll">
					<a-collapse v-model="activeKey">
						<a-collapse-panel
							:key="item.key"
							:header="item.name"
							v-for="item in componentsList"
						>
							<draggable
								v-model="item.child"
								draggable=".li"
								v-bind="dragOptions"
								:options="{ sort: false, group: item.group }"
							>
								<div
									v-for="d in item.child"
									:key="d.id + 'item'"
									:class="[
										'li',
										d.componentName,
										d.col == 12 ? 'w5' : null,
										d.activeKey ? 'active' : null
									]"
								>
									<div class="txt">{{ d.name }}</div>
									<img
										class="img"
										:src="
											require(`@/assets/images/configuration/${d.imgSrc}.png`)
										"
										alt=""
									/>
									<div
										class="eyes"
										@mouseover="panelShow($event, d, item)"
										@mouseout="panelHide"
									></div>
								</div>
								<div
									:class="[
										'amplifier-img-box',
										panelComponentName
									]"
									:style="{ top: panelTop, left: panelLeft }"
									v-show="
										panelFlag && panelParentKey == item.key
									"
								>
									<div class="panel-title">
										{{ panelName }}
									</div>
									<img
										class="panel-img"
										:src="panelImgSrc"
										alt=""
									/>
								</div>
							</draggable>
						</a-collapse-panel>
					</a-collapse>
				</div>

内容区json

contentList:[
	{
		id: 1,
		type: 0,
		col: 24,
		name: "默认样式",
		imgSrc: "TopIndicator",
		componentName: "TopIndicator",
		activeKey: false
	},
	{
		id: 4,
		type: 0,
		col: 24,
		name: "默认样式",
		imgSrc: "IncomeIndicators",
		componentName: "IncomeIndicators",
		activeKey: false
	},
  ......
]

内容区代码,实现思路是用:is="item.componentName"去对应组件名注册写好的组件,这样就可以在draggable的渲染布局里面渲染具体组件

		<draggable
					class="content beautify-scroll"
					group="module"
					v-bind="dragOptions"
					:list="contentList"
					@change="toChange"
				>
					<div
						v-for="(item, index) in contentList"
						:key="'r' + index"
						:class="[
							'item',
							item.componentName,
							item.col == 12 ? 'w5' : null
						]"
					>
							<component
								:key="'c' + item.componentName + item.type"
								:is="item.componentName"
								:isEdit="true"
								:type="Number(item.type)"
								@click.native="selectContentItem(item)"
								:class="[
									item.id == contentActiveId ? 'active' : null
								]"
							></component>
							<div
								v-show="item.id == contentActiveId"
								class="delbtn"
								@click="del(item, index)"
							></div>
					</div>
		  </draggable>

小眼睛显示预览图浮框不建议用hover去做,因为这里样式涉及overflow: hidden;如下图用鼠标事件去做会更好。

methods:

// 鼠标移入显示浮态框
		panelShow(e, d, item) {
			console.log(e, d, item);
			this.panelName = item.name + " - " + d.name;
			this.panelComponentName = d.componentName;
			this.panelImgSrc = require(`@/assets/images/configuration/${d.imgSrc}.png`);
			// 获取窗口宽度
			let windowHeight =
				window.innerHeight ||
				document.documentElement.clientHeight ||
				document.body.clientHeight;
			// 判断当前鼠标位置加上面板位置大于窗口宽度,表示超出不足以显示,定位向上进行定位
			if (e.clientY + 276 > windowHeight) {
				this.panelTop = e.clientY - 296 + "px";
			} else {
				this.panelTop = e.clientY - 40 + "px";
			}

			this.panelLeft = e.clientX + 26 + "px";
			this.panelParentKey = item.key;
			this.panelFlag = true;
		},
		// 鼠标移出隐藏浮态框
		panelHide() {
			this.panelFlag = false;
			this.panelName = "";
			this.panelImgSrc = undefined;
		},

最后再补上一个组件的删除函数,因为内容区删除要联动把组件区选中态去除,所以这里的删除里面要多一些逻辑控制

	del(el, idx) {
			this.contentList.splice(idx, 1);
			// 删除 取消框选态
			this.componentsList.map((item) => {
				item.child.map((i) => {
					if (i.id == el.id) {
						i.activeKey = false;
					}
				});
			});
		},

创作不易,点赞支持!!!文章来源地址https://www.toymoban.com/news/detail-842544.html

到了这里,关于低代码开发之vue.draggable的使用(进阶:组件化拖拽生成功能页面)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Vue】Vite 组件化开发

    1. 什么是组件化开发 组件化开发指的是:根据封装的思想,把页面上可重用的部分封装为组件,从而方便项目的开发和维护。 例如:https://gitee.com/vdpadmin/variant-form 所展示的效果,就契合了组件化开发的思想。用户可以通过拖拽组件的方式,快速生成一个页面的布局结构。

    2024年02月10日
    浏览(48)
  • Android组件化架构开发--为什么要使用组件化?组件分层?组件路由的简单实现。

    1.1 单工程项目结构 一般我们都是一个业务建一个包 缺点: 各种业务代码混杂在同一个模块里,开发人员在开发、调测过程的效率越来越低,定位某个业务问题,需要在多个业务代码混合的模块中寻找和跳转。 需要了解各个业务的功能,避免代码的改动影响其它业务的功能

    2024年02月10日
    浏览(64)
  • 前端Vue入门-day03-用Vue实现工程化、组件化开发

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 生命周期 Vue 生命周期 和 生命周期的四个阶段  Vue 生命周期函数(钩子函数) 案例-create的应用 案例-mounted的应用 工程化开发 脚手架 Vue CLI 开发 Vue 的两种方式 基本介

    2024年02月15日
    浏览(59)
  • 【vue2第九章】组件化开发和根组件以及style上的scoped作用

    组件化开发和根组件 什么是组件化开发? 一个页面可以拆分为多个组件,每个组件有自己的 样式,结构,行为 ,组件化开发的好处就是,便于维护,利于重复利用,提升开发的效率。 便于维护 :页面中块出了问题,可以直接去找到这个组件,修改组件的样式逻辑结构。

    2024年02月10日
    浏览(53)
  • Vue(组件化编程:非单文件组件、单文件组件)

    传统组件编写:不同的HTML引入不同的样式和行为文件 组件方式编写:组件单独, 复用率高(前提组件拆分十分细致)  理解为封装行为:html,css,js封装在一个文件中 解释模块化和组件化的区别: 组件化 :css,js,html三件套使用在同一部分的代码封装在一个组件中 模块化

    2024年02月01日
    浏览(53)
  • 二、Vue组件化编程

    Vue 中使用组件的三大步骤: 定义组件(创建组件) 注册组件 使用组件(写组件标签) 如何定义一个组件? 使用 Vue.extend(options) 创建,其中 options 和 new Vue(options) 时传入的那个 options 几乎一样,但也有点区别; 区别如下: el 不要写,为什么? ——— 最终所有的组件都要经过一

    2024年02月22日
    浏览(45)
  • VUE3 --->组件化

    目录 vue-cli 1、基于 vue ui 创建 vue 项目  组件库 1.vue 组件库 2.vue 组件库和 bootstrap 的区别 3. 最常用的 vue 组件库 4. Element UI axios 拦截器 1. 回顾:在 vue3 的项目中全局配置 axios 2. 在 vue2 的项目中全局配置 axios 3、拦截器 4. 配置请求拦截器 5、配置响应拦截器 proxy 跨域代理 1. 回

    2024年02月15日
    浏览(35)
  • 通用vue组件化登录页面

    1.首先建立一个login文件夹,在里面建立对应的login.vue文件 2.设置登录页面的背景图,在App.vue文件中使用router-view进行展示登录组件 3.先给App.vue的div元素设置高度100%,之后在login.vue里面去设置背景图 这里注意怎么使login组件垂直水平居中的样式 1.首先建立一个cpns的文件夹,里

    2024年02月09日
    浏览(42)
  • 组件化开发之如何封装组件-react

    组件是构建用户界面的基本单元,它是一个独立的、可重用的、可组合的代码单元,用于表示UI的一部分。 人话:当谈论组件时,就像在搭积木一样,每个组件都是一个 独立的、可以重复使用 的代码块,用来构建网页或应用的各个部分。比如界面的布局,像按钮、文本输入

    2024年02月11日
    浏览(63)
  • 小程序组件化开发

        随着小程序的普及,越来越多的开发者开始使用小程序进行开发,而小程序的组件化开发已经成为了一种标配的开发模式。本文将深入介绍小程序组件化开发的相关知识,包括组件的定义、生命周期、通信和使用等方面,帮助大家更好地理解和使用小程序的组件化开发

    2023年04月20日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包