使用 React 为 Chimee 开发插件
Chimee1 是由奇舞团开源的一套可扩展的H5组件化播放器框架。由于前段时间业务有视频播放的需求所以使用了它,并基于它提供的插件系统之上开发了一系列的插件,其中最复杂的是控制条插件。由于默认的样式无(实)法(在)满(是)足(太)设(难)计(看)需(了)求(!),所以我们重新开发了一套 lizheing/chimee-plugin-controlbar2 并总结一些心得,希望对大家有帮助。
const plugin = {
// 插件名为 controller
name: 'controller',
// 插件实体为按钮
el: '<button>play</button>',
data: {
text: 'play'
},
methods: {
changeVideoStatus () {
this[this.text]();
},
changeButtonText (text) {
this.text = text;
this.$dom.innerText = this.text;
}
},
// 在插件创建的阶段,我们为插件绑定事件。
create () {
this.$dom.addEventListener('click', this.changeVideoStatus);
},
// 插件会在播放暂停操作发生后改变自己的文案及相应的行为
events: {
pause () {
this.changeButtonText('play');
},
play () {
this.changeButtonText('pause');
}
}
};
// 安装插件
Chimee.install(plugin);
const player = new Chimee({
// 播放地址
src: 'http://cdn.toxicjohann.com/lostStar.mp4',
// dom容器
wrapper: '#wrapper',
// 使用插件
plugin: ['controller'],
});
通过以上示例代码我们可以发现 Chimee 的插件的规则主要有以下几点:
插件需要暴露一个对象,并带有 name 属性用来标记插件名称,方便后续实例化的时候指定。 HTML 模板相关的内容需要放在el 属性中,在其它方法中可以通过 this.$dom 访问到 DOM 对象。 data属性用来存放数据,methods属性可以用来存放方法。两个属性中的数据可以直接通过this.xx 的形式访问到。 events() 属性可以放置一些播放器的事件回调,Chimee 会自动做事件的绑定。
data 虽然能存放数据,但是数据无法直接映射到 el 的 HTML 模板中,导致还是需要回归原本的 DOM 操作。 事件绑定需要等待 DOM 生成后在生命周期中进行手动的绑定,又回到了 DOM 操作时一堆 addEventListener 的年代了。
由于我们的业务是使用 React 开发的,所以就想是否可以通过引入 React 来解决上述 DOM 操作的问题。
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import Context from './Context';
export default {
Context,
name: 'plugin-demo',
el: `<div class="plugin"></div>`,
create() {
ReactDOM.render(
<Context.Provider value={this}>
<App />
</Context.Provider>,
this.$dom
);
}
};
Context 解决访问插件方法问题
import React, { useContext, useState, useEffect } from 'react';
import Context from '../Context';
export default function () {
const ctx = useContext(Context);
const [cur, setCur] = useState(0);
useEffect(() => {
ctx.$on('timeupdate', () => setCur(ctx.currentTime));
}, []);
return (
<div className="play--time">{cur}</div>
)
}
事件监听解决外部数据触发更新问题
回到具体的业务场景上,我们有一个需求是控制条需要显示下一条视频的标题和封面图,而这个数据是在业务代码中通过接口获取得到的,所以在最开始实例化播放器的时候我们是没办法传入该数据。最后我们决定用事件监听的方式解决该问题,通过自定义事件进行跨组件层级的数据传递。
多插件先后问题
import React, {useEffect} from 'react';
import Context from './context';
export default function() {
const ctx = useContext(Context);
useEffect(() => {
const onEnded = event => {
if(event === 'manual') {
return true;
}
setTimeout(() => ctx.$emit('ended', 'manual'), 10000);
return false;
};
ctx.$on('ended', onEnded);
return () => ctx.$off('ended', onEnded);
});
return (<div>推迟10秒后结束</div>);
}
Chimee 的插件系统可扩展性比较强,如果对其比较感兴趣的可以看看官方的这篇《为什么要将 Chimee 设计成一个组件化框架?》4。使用 React 开发插件解决了事件和数据绑定的问题,该开发模式下基本上就是废弃了官方自己提供的 data, methods 和 events 三个属性,前两者自然是由 React 内部的state 和方法提供,后者则是自行在组件内部使用 ctx.$on 的形式手动监听。
文内链接
https://chimee.org https://github.com/lizheming/chimee-plugin-controlbar http://chimee.org/docs/how_to_write_a_plugin.html https://github.com/Chimeejs/chimee/blob/7ea5ed844b/doc/zh-cn/design/why-chimee-is-a-frame.md
关注我们
界世的你当不
只做你的肩膀
无
360官方技术公众号
技术干货|一手资讯|精彩活动
空·
- 使用WebStrom开发设置ReactNative关于JSX中的XML部分的智能提示插件的安装办法
- 在Eclipse中使用RDT插件进行Ruby开发(1)
- 在Eclipse中使用RDT插件进行Ruby开发(2)
- FCKeditor插件开发及使用
- Eclipse入门—使用指南及开发Eclipse插件
- 使用 Apache Derby 开发 Eclipse 插件
- FireFox插件和扩展开发(二)——编写和使用XPCOM组件
- Eclipse开发环境中使用maven插件的配置备忘
- 【转贴】VS.NET 2003集成环境插件开发指南(二)----使用窗口
- Eclipse plugins 插件开发学习 - 使用 IScanner 扫描 Java 源代码
- 使用c++开发excel插件 (第2章深入excel)
- 使用Eclipse和RDT插件进行Ruby开发(二)
- LAMP开发精要(5):在 Wordpress 插件中使用样式表
- 【Android浏览器插件开发准备工作之NPAPI】使用Visual Studio 2008 运行Firefox浏览器插件实例npruntime
- VC6.0 使用小结--让开发更加快捷的vc插件
- 使用eclipse+git插件开发android项目时遇到的问题及解决
- 使用Eclipse+RDT插件进行Ruby开发
- 使用VIM开发软件项目 - (7) lookupfile插件
- MS IDE RAD技术入门----VC6插件开发入门(1)----使用VC来可行性
- 浅谈vb.net开发中使用excel插件代码