如何编写一个 UI 插件
本章节假设你已经大体了解了 Chimee 插件机制,我们一起来看一下怎么编写一个UI插件。
这里我们以比较通用的模态窗插件 popup
为例(点击这里看示例效果)。
需求准备
首先我们的梳理一下基本的插件需求:
- UI层面
- 要有标题栏
- 内容区域
- 关闭按钮
- 功能层面
- 希望能控制开启关闭;
- 当插件开启的时候,我们希望她的显示层级
z-index
高于其他插件,避免被遮挡。 - 当popup开启时播放器要暂停播放
- 当popup关闭时播放器切为播放状态
- 事件交互
- 当播放器开始播放时,自动关闭popup
- 当播放器暂停时,自动打开popup
- 我们也希望这个插件的开关状态变化能通知到别的插件,让其他人可以有所感知。
看起来还挺麻烦,下面赶紧让我们一起看看怎么实现。
编码实现
首先我们要结合上面的需求,编写一个符合 PluginConfig 约定的插件配置:
const popupPluginConfig = {
name: 'mypopup',
// 使用 el 设置插件的容器 HTMLTagName
el: 'chimee-popup',
// 在插件创建生命周期,实现DOM结构和基本的交互行为
create () {
this.$dom.innerHTML = `
<pp-close title=“我是关闭按钮”>×</pp-close>
<pp-title>这里是标题</pp-title>
<pp-body>这里是内容</pp-body>
`;
// 为关闭按钮绑定关闭交互
this.$dom.querySelector('pp-close').addEventListener('click', this.close);
},
methods: {
// 为插件实现关闭功能
close () {
this.$dom.style.display = 'none';
// 开始播放
this.$emit('play');
// 通知全局popup关闭了,并通过参数将关闭的popup实例传递过去
this.$emit('popupClose', this);
},
// 为插件实现开启功能
open () {
// 提升z-index为最高
this.$bumpToTop();
this.$dom.style.display = 'block';
// 暂停播放
this.$emit('pause');
// 通知全局popup打开了,并通过参数将关闭的popup实例传递过去
this.$emit('popupOpen', this);
}
},
events: {
// 监听播放器播放事件,以实现播放时自动关闭popup
play () {
this.close();
},
// 监听播放器暂停事件,以实现暂停时自动打开popup
pause () {
this.open();
}
}
};
基于 Chimee Plugin
实现很简单对不对?让我们先结合前面章节的插件应用使用起来看看。
Chimee.install(popupPluginConfig);
const chimee = new Chimee({
wrapper: '#wrapper',
plugins: [popupPluginConfig.name]
});
// 我们可以在相应业务逻辑里使用开启或关闭方法控制我们的popup
chimee.mypopup.open();
chimee.mypopup.close();
不过上面的代码没有包含css,如果要看效果记得参考下面示例定制自己的样式:
chimee-popup { position: absolute; color: #fff; background-color: rgba(88, 88, 88, 0.5); font-size: 13px; font-family: sans-serif; border: 1px solid rgba(255, 255, 255, 0.08); padding: 3px; width: 200px; left: 50%; top: 50%; transform: translate(-50%, -50%); } chimee-popup pp-title{ border-bottom: 1px solid rgba(255, 255, 255, 0.18); padding: 0 5px 4px; margin-bottom: 5px; } chimee-popup pp-body { display: block; padding: 3px 3px 6px; } chimee-popup pp-close{ float: right; color: #fff; text-decoration: none; opacity: .8; cursor: pointer; line-height: 14px; text-shadow: 0 0 1px #000; font-size: 15px; padding: 0 3px; cursor: pointer; }
小结
当然,上面只是一个简单的例子,还有很多功能是没有用上的。
基于 Chimee PluginConfing
API可以非常方便的实现自己想要的UI插件,比如广告控制。
也许你已经想到可以做更多的事情了吧?赶紧行动起来吧!插件开发API有什么建议或想法也欢迎随时反馈。
popupFactory
另外,为了方便实现弹层插件,我们也另外抽象了一个popup工厂方法, 像开始提到的popup示例以及前文的广告示例就是基于这个实现的。
基于这个包装你的 pluginConfig
,我们给popup提供了一些定制化参数和 methods
扩展,可以更方便的进行尺寸大小、坐标位置控制等。