插件体系

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

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

omi-drag

且看这个例子:

点击这里→在线试试

import OmiDrag from './omi-drag.js';OmiDrag.init();class App extends Omi.Component {constructor(data) {super(data);}render() {return  `<div><div omi-drag class="test">Drag Me</div></div>`;}style(){return `.test{width:100px;height:100px;color:white;line-height:90px;text-align:center;background-color:#00BFF3;}`}
}Omi.render(new App(),"#container");复制代码

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

Omi.extendPlugin

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

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

;(function () {var OmiDrag = {};var Omi = typeof require === 'function'? require('omi'): window.Omi;OmiDrag.init = function(){Omi.extendPlugin('omi-drag',function(dom, instance){dom.style.cursor='move';var isMouseDown = false,preX = null,preY = null,currentX = null,currentY = null,translateX = 0,translateY = 0;dom.addEventListener('mousedown',function(evt){isMouseDown = true;preX = evt.pageX;preY = evt.pageY;evt.stopPropagation();},false);window.addEventListener('mousemove',function(evt){if(isMouseDown){currentX = evt.pageX;currentY = evt.pageY;if(preX != null){translateX += currentX - preX;translateY += currentY - preY;dom.style.transform = 'translateX('+translateX+'px) translateY('+translateY+'px)';}preX = currentX;preY = currentY;evt.preventDefault();}},false);window.addEventListener('mouseup',function(){isMouseDown = false;preX = preY = currentX = currentY = null;},false);});}OmiDrag.destroy = function(){delete Omi.plugins['omi-drag'];};if (typeof exports == "object") {module.exports = OmiDrag;} else if (typeof define == "function" && define.amd) {define([], function(){ return OmiDrag });} else {window.OmiDrag = OmiDrag;}})();复制代码

方法: Omi.extendPlugin( pluginName, handler )

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

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

关联instance

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

...
...
moveHandler(){console.log('moving');
}render() {return  `<div><div omi-drag class="test">Drag Me</div></div>`;
}
...复制代码

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

...
window.addEventListener('mousemove',function(evt){if(isMouseDown){currentX = evt.pageX;currentY = evt.pageY;if(preX != null){translateX += currentX - preX;translateY += currentY - preY;dom.style.transform = 'translateX('+translateX+'px) translateY('+translateY+'px)';}preX = currentX;preY = currentY;evt.preventDefault();instance.moveHandler(evt);}
},false);复制代码

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

...
render() {return  `<div><div omi-drag class="test">Drag Me</div><div omi-drag class="test">Drag Me</div></div>`;
}
...复制代码

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

...
...
moveHandlerA(){console.log('moving');
}moveHandlerB(){console.log('moving');
}render() {return  `<div><div omi-drag class="test">Drag Me A</div><div omi-drag class="test">Drag Me B</div></div>`;
}
...复制代码

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

传递数据

先来看最后实现的效果:

...
...
moveHandlerA(){console.log('moving');
}moveHandlerB(){console.log('moving');
}render() {return  `<div><div omi-drag class="test" dragMove="moveHandlerA" >Drag Me A</div><div omi-drag class="test" dragMove="moveHandlerB" >Drag Me B</div></div>`;
}
...复制代码

omi-drag修改的地方:

...
var handlerName = dom.getAttribute('dragMove');window.addEventListener('mousemove',function(evt){if(isMouseDown){currentX = evt.pageX;currentY = evt.pageY;if(preX != null){translateX += currentX - preX;translateY += currentY - preY;dom.style.transform = 'translateX('+translateX+'px) translateY('+translateY+'px)';}preX = currentX;preY = currentY;evt.preventDefault();instance[handlerName](evt);}
},false);
...复制代码
  • 通过 var handlerName = dom.getAttribute('dragMove') 拿到dom上声明的dragMove
  • 通过 instancehandlerName 去执行对应的方法

点击这里→在线试试

更多插件

  • omi-finger Omi的AlloyFinger插件,支持各种触摸事件和手势
  • omi-transform Omi的transformjs插件,快速方便地设置DOM的CSS3 Transform属性
  • omi-touch Omi的AlloyTouch插件,Omi项目的触摸运动解决方案(支持触摸滚动、旋转、翻页、选择等等)
  • omi-jquery-date-picker Omi的时间选择插件,支持各种时间或者时间区域选择

相关

  • Omi的Github地址github.com/AlloyTeam/o…
  • 如果想体验一下Omi框架,可以访问 Omi Playground
  • 如果想使用Omi框架或者开发完善Omi框架,可以访问 Omi使用文档
  • 如果你想获得更佳的阅读体验,可以访问 Docs Website
  • 如果你懒得搭建项目脚手架,可以试试 omi-cli
  • 如果你有Omi相关的问题可以 New issue
  • 如果想更加方便的交流关于Omi的一切可以加入QQ的Omi交流群(256426170)

Omi教程-插件体系相关推荐

  1. 链路追踪 SkyWalking 源码分析 —— Agent 插件体系

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 中文详细注释的开源项目 消息中间件 RocketMQ 源码解析 数据库中间件 ...

  2. C#下的插件体系探讨

    最近公司里软件部门打算整合公司的资源,进行公司整体平台架构的研发.公司的软件系统主要包含BS和CS两种类型的应用,打算做到系统的一体化集成,在系统建设中打算采用插件体系的建设,统一插件开发方式,做到系 ...

  3. cass地籍参数设置命令_想成为一名厉害的测绘员?南方Cass教程+插件+课件不可少!...

    想成为一名厉害的测绘员?南方Cass教程+插件+课件不可少! 南方Cass绝对是测绘人的工作神器,强大的测绘功能,精准的计算无一不受广大测绘人的好评.自推出上线以来已经占据了我国绝大部分的测绘市场,但 ...

  4. batchplot 3.6.2 插件_直播插件体系设计

    | 导语   直播页面是一个功能丰富且复杂的页面,整个页面几乎全部由若干个功能组件构成,在这样一个背景下,如何通过前期的合理设计来接入这些功能组件,同时提高页面的扩展性和可维护性. 一.背景 开播了鹅 ...

  5. autocad完全应用指南_2020版AutoCAD软件+操作教程+插件合集,限时3天领

    如今CAD在建筑行业内非常火爆啊,它有自己独特的图库.模型素材等,需要的时候直接搜索所需要的内容,非常方便,深受广大建筑朋友们的喜欢,是学习CAD朋友们的超大福利!! 这份CAD软件+操作教程+上百的 ...

  6. Rainbond插件体系设计简介

    过去几年,利用容器打包和部署代码的方式日益流行,越来越多企业开始测试或是已经在生产环境中运行了微服务架构应用,开始直接面对和解决分布式服务化架构演变中出现的各种问题. 在这样的趋势和大环境下,无服务器 ...

  7. Cordova打包教程知识体系整理(Vue项目打包成ipa)

    使用工具: 1.Webstorm2017 Webstorm2017安装以及破解和汉化: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  8. WordPress初学者入门教程-插件

    本文源自:https://wpeyes.com/wordpress 在本节中,我们将更详细地重新访问插件. 我想解释一下插件是什么,你可以在哪里获得它们,以及如何安装它们.我还会带你了解一些重要的插件 ...

  9. G6 图可视化引擎——入门教程——插件与工具

    为辅助用户在图上探索,G6 提供了一些辅助工具,其中一部分是插件工具,另一部分是交互工具. 本文将为 Tutorial 案例 添加缩略图插件.网格插件.节点提示框.边提示框. 插件 使用插件时,有三个 ...

最新文章

  1. Tesseract-OCR引擎 入门
  2. Qt中的图像处理与绘制
  3. 1022 D进制的A+B (20 分)(c语言)
  4. Spring Cloud Config入门(本地配置)
  5. 【UIKit】UITableView 3
  6. linux java 部署 生产环境
  7. 【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现
  8. android 销毁按钮,Android实现所有Activity全部销毁
  9. ios设计规范_e微课5期:ios设计规范带来的设计细节(下篇)
  10. HTML关于机器猫的小游戏,HTML5/CSS3 哆啦A梦 | 机器猫卡通肖像
  11. RegistryHelper-注册表辅助类
  12. linux自建git仓库
  13. 查看各浏览器各版本的兼容情况
  14. 移动周报:最受欢迎的跨平台开发工具推荐
  15. 如何用c语言程序预测身高,测身高的C语言程序.doc
  16. linux需要安装杀病毒软件,我在Linux上需要安装反病毒软件吗?
  17. 交换机、路由器、服务器、存储选型
  18. AMD XILINX宣布2023年产品涨价8%
  19. 借华为鸿蒙系统发布,谈谈操作系统的爱恨情仇发展史
  20. android listview视差滚动,android – ListView在滚动时覆盖另一个布局

热门文章

  1. 华为 P50 背后的心酸和悲壮
  2. php论坛安装方法,PHPWind8.5论坛风格安装使用详细教程
  3. Vue3中 内置组件 Teleport 详解
  4. 垃圾桶理论:有效解决员工办事拖沓作风 | 每天成就更大成功
  5. (三)k8s资源清单
  6. c++的ThreadPool,OpenHarmony源码实现版赏析和使用
  7. 适用于Web开发人员的20个CSS调色板
  8. Python 中for else的用法
  9. 使用PHPmailer发送邮件的详细代码
  10. Linux/UNIX学习之管道