课程表

Omi课程

工具箱
速查手册

Omi 插件体系

当前位置:免费教程 » JS/JS库/框架 » Omi

Omi是Web组件化框架,怎么又来了个插件的概念?

可以这么理解: Omi插件体系可以赋予dom元素一些能力,并且可以和组件的实例产生关联。

omi-drag

且看这个例子:

点击这里→在线试试

  1. import OmiDrag from './omi-drag.js';
  2. OmiDrag.init();
  3. class App extends Omi.Component {
  4. constructor(data) {
  5. super(data);
  6. }
  7. render() {
  8. return `
  9. <div>
  10. <div omi-drag class="test">Drag Me</div>
  11. </div>
  12. `;
  13. }
  14. style(){
  15. return `
  16. .test{
  17. width:100px;
  18. height:100px;
  19. color:white;
  20. line-height:90px;
  21. text-align:center;
  22. background-color:#00BFF3;
  23. }
  24. `
  25. }
  26. }
  27. Omi.render(new App(),"#container");

如上面的代码所示,通过在div上标记omi-drag,这个div就能够被用户使用鼠标拖拽。我们称omi-drag.js为omi插件。 是不是非常方便?那么这个omi-drag是怎么实现的?

Omi.extendPlugin

核心方法: Omi.extendPlugin( pluginName, handler )

下面的代码就是展示了如何通过 Omi.extendPlugin 赋予dom拖拽的能力:

  1. ;(function () {
  2. var OmiDrag = {};
  3. var Omi = typeof require === 'function'
  4. ? require('omi')
  5. : window.Omi;
  6. OmiDrag.init = function(){
  7. Omi.extendPlugin('omi-drag',function(dom, instance){
  8. dom.style.cursor='move';
  9. var isMouseDown = false,
  10. preX = null,
  11. preY = null,
  12. currentX = null,
  13. currentY = null,
  14. translateX = 0,
  15. translateY = 0;
  16. dom.addEventListener('mousedown',function(evt){
  17. isMouseDown = true;
  18. preX = evt.pageX;
  19. preY = evt.pageY;
  20. evt.stopPropagation();
  21. },false);
  22. window.addEventListener('mousemove',function(evt){
  23. if(isMouseDown){
  24. currentX = evt.pageX;
  25. currentY = evt.pageY;
  26. if(preX != null){
  27. translateX += currentX - preX;
  28. translateY += currentY - preY;
  29. dom.style.transform = 'translateX('+translateX+'px) translateY('+translateY+'px)';
  30. }
  31. preX = currentX;
  32. preY = currentY;
  33. evt.preventDefault();
  34. }
  35. },false);
  36. window.addEventListener('mouseup',function(){
  37. isMouseDown = false;
  38. preX = preY = currentX = currentY = null;
  39. },false);
  40. });
  41. }
  42. OmiDrag.destroy = function(){
  43. delete Omi.plugins['omi-drag'];
  44. };
  45. if (typeof exports == "object") {
  46. module.exports = OmiDrag;
  47. } else if (typeof define == "function" && define.amd) {
  48. define([], function(){ return OmiDrag });
  49. } else {
  50. window.OmiDrag = OmiDrag;
  51. }
  52. })();

方法: Omi.extendPlugin( pluginName, handler )

其中pluginName为插件的名称 其中handler为处理器。handler可以拿到标记了pluginName的dom以及dom所在的组件的实例,即 dom 和 instance。

通过 Omi.extendPlugin,可以赋予dom元素一些能力,也可以和组件的实例(instance)产生关联。 但是上面的例子没有和instance产生关联,我们接下来试试:

关联instance

我们想在组件里面能够监听到move并且执行回调。如下:

  1. ...
  2. ...
  3. moveHandler(){
  4. console.log('moving');
  5. }
  6. render() {
  7. return `
  8. <div>
  9. <div omi-drag class="test">Drag Me</div>
  10. </div>
  11. `;
  12. }
  13. ...

主要被拖动过程中,moveHandler就不断地被执行。插件代码需要修改:

  1. ...
  2. window.addEventListener('mousemove',function(evt){
  3. if(isMouseDown){
  4. currentX = evt.pageX;
  5. currentY = evt.pageY;
  6. if(preX != null){
  7. translateX += currentX - preX;
  8. translateY += currentY - preY;
  9. dom.style.transform = 'translateX('+translateX+'px) translateY('+translateY+'px)';
  10. }
  11. preX = currentX;
  12. preY = currentY;
  13. evt.preventDefault();
  14. instance.moveHandler(evt);
  15. }
  16. },false);

我们在里面增加了instance.moveHandler(evt);方法,用来执行组件实例上的moveHandler方法。 这样的话:就是组件的实例(instance)产生关联。但是还是有问题?如果标记了多个omi-drag 就会有问题!如:

  1. ...
  2. render() {
  3. return `
  4. <div>
  5. <div omi-drag class="test">Drag Me</div>
  6. <div omi-drag class="test">Drag Me</div>
  7. </div>
  8. `;
  9. }
  10. ...

通常我们系统每个omi-drag都能对应一个回调函数,如:

  1. ...
  2. ...
  3. moveHandlerA(){
  4. console.log('moving');
  5. }
  6. moveHandlerB(){
  7. console.log('moving');
  8. }
  9. render() {
  10. return `
  11. <div>
  12. <div omi-drag class="test">Drag Me A</div>
  13. <div omi-drag class="test">Drag Me B</div>
  14. </div>
  15. `;
  16. }
  17. ...

怎么办?怎么实现?有办法!通过dom传递数据给插件。

传递数据

先来看最后实现的效果:

  1. ...
  2. ...
  3. moveHandlerA(){
  4. console.log('moving');
  5. }
  6. moveHandlerB(){
  7. console.log('moving');
  8. }
  9. render() {
  10. return `
  11. <div>
  12. <div omi-drag class="test" dragMove="moveHandlerA" >Drag Me A</div>
  13. <div omi-drag class="test" dragMove="moveHandlerB" >Drag Me B</div>
  14. </div>
  15. `;
  16. }
  17. ...

omi-drag修改的地方:

  1. ...
  2. var handlerName = dom.getAttribute('dragMove');
  3. window.addEventListener('mousemove',function(evt){
  4. if(isMouseDown){
  5. currentX = evt.pageX;
  6. currentY = evt.pageY;
  7. if(preX != null){
  8. translateX += currentX - preX;
  9. translateY += currentY - preY;
  10. dom.style.transform = 'translateX('+translateX+'px) translateY('+translateY+'px)';
  11. }
  12. preX = currentX;
  13. preY = currentY;
  14. evt.preventDefault();
  15. instance[handlerName](evt);
  16. }
  17. },false);
  18. ...
  • 通过 var handlerName = dom.getAttribute('dragMove') 拿到dom上声明的dragMove
  • 通过 instance handlerName 去执行对应的方法

点击这里→在线试试

更多插件

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号