1、前言
感谢各位看官对我的关注和浏览,因为我也是初次写博客类,如有不好的地方大家可以发评论讨论一下,再次感谢官方的推荐以及各位看官,我就不说太多的废话,尽量以大家能懂的白话讲一下。
书接上回,回忆一下一个元素从无到有需要经历:1、选择元素。2、初始元素的默认属性。3、元素的动作行为。如果大家有点蒙蔽的话可以看下我的第一篇介绍:H5编辑器整体思路(一):前言,这一节我们大概讲一下项目的整个布局以及元素的创建
2、组件的效果
3、页面分布
页面分布主要分为以下区域:
1、头部组件区域
2、左侧页面、弹窗类型区域
3、左侧页面管理、弹窗管理区域
4、中间画布区域
5、画布右侧快捷管理条
6、右侧(组件、页面)的属性、事件、动画等管理区域
4、头部组件
头部组件通过一个配置文件数组来让其for循环后展示
export default [
{
title: '图片',// 组件的名称
icon: 'tupian', // 展示组件的icon名称
activeIcon: 'tupian-active', // 展示组件数据移入后的icon
elName: 'image',// 组件对应plugin的名称(每个组件的elName都是唯一)
valueType: '', // 标识数据类型,用于表单组件,
defaultStyle: { // 默认宽高
width: 300,
height: 168.75
},
defaultEname: '图片',
hasAttr: true, //是否有属性
hasEvent: true, // 是否有事件
hasAnimation: true,// 是否有动画
hasStyle: false,
childrens: []
},
{
title: '控件',
icon: 'kongjian',
activeIcon: 'kongjian-active',
elName: 'qk-control',
defaultEname: '控件',
childrens: [
...
]
}
];
如果你需要这样只需要在上述的数据结构的childrens数组内增加组件类型
5、创建组件
创建组件通过函数createElement来完成
creatElement() {
// 获取元素的props
let props = this.getComponentProps(this.element.elName);
let item = { needProps: props, ...this.element };
// 新增组建
this.addElement(item);
this.setIsActiveElement(true);
this.$emit('setOperationBar', this.element);
this.$nextTick(() => {
if (item.elName === 'qk-text') {
// 如果是文本组件就双击选中文本的内容
this.$Bus.$emit('selectText', this.activeElement.uuid);
}
});
}
通过函数getComponentProps获取当前组件的props设置,比如图片组件的props是这样
props: {
imageSrc: {
type: String,
default: ''
}
}
再比如视频组件的props是这样的
props: {
video: {
type: Object,
default: () => {
return {
width: '100%',
height: '',
videoSrc: '',
type: 'autoPlay',
name: '',
id: randomStr(5),
isPreview: false,
noControls: false,
voice: false, // 静音
control: true, // 状态栏默认不显示
loop: true // 循环
};
}
}
},
获取默认的props主要是为了初始化组件的默认值。
然后通过addElement创建组件的数据结构,也就是H5编辑器整体思路(一):前言中提到的组件数据,如果不清楚可以点过去看一下,上述的props的数据值都会被塞进组件数据结构中propsValue,并且将当前的元素添加至当前的页面当中
然后设置当前选中的元素为图片元素,这就是组件元素的初始创建。
走到这步基本上一个初始的元素就被创建出来了
从上图可以看到右侧打印看出,元素被添加至pages.elements的数组中。
右侧部分的控制,主要是控制它的样式,长宽高等还有名称。右侧代码的实现主要放在attr的文件夹
每个文件对应相应的组件设置,这里的属性设置主要是针对它的样式和它的一些功能,这里大家可以根据各自公司业务的不同做相应的调整,调整宽高、位置就是动态更改当前element的commonStyle,然后动态更改。
其实前面所有组件的生产内容其实都还是比较简单的。比较复杂的可能属于组件的拖拽、放大缩小、旋转等功能。相信有人会说这块可以用相应的插件,其实我当时在写的时候没找到好用的插件,到后面某次迭代元素的辅助线、吸附这个功能的时候在github找到了相应的插件,但是事已至此我已经无法回头,所以这里的功能就是我自己手撸的。
本次的分享到此结束,下节分享我重点拿组件的拖拽、旋转、等比例放大缩小、不等比例放大缩小做详细拆解
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情