<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      Omi教程-插件體系

      2017-03-01 09:31  【當耐特】  閱讀(1430)  評論(2)    收藏  舉報

      插件體系

      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 `
              <style>
              .test{
                  width:100px;
                  height:100px;
                  color:white;
                  line-height:90px;
                  text-align:center;
                  background-color:#00BFF3;
              }
              </style>
              `
          }
      }
      
      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的Github地址https://github.com/AlloyTeam/omi
      • 如果想體驗一下Omi框架,可以訪問 Omi Playground
      • 如果想使用Omi框架或者開發完善Omi框架,可以訪問 Omi使用文檔
      • 如果你想獲得更佳的閱讀體驗,可以訪問 Docs Website
      • 如果你懶得搭建項目腳手架,可以試試 omi-cli
      • 如果你有Omi相關的問題可以 New issue
      • 如果想更加方便的交流關于Omi的一切可以加入QQ的Omi交流群(256426170)
      主站蜘蛛池模板: 精品91在线| 东京热一精品无码av| 内江市| 国产精品中文字幕日韩| 亚洲一区二区三区人妻天堂 | 一区二区不卡国产精品| 国产在线啪| 国产一区二区三区导航| 在线无码av一区二区三区| 伊人激情av一区二区三区| 国内极度色诱视频网站| 久久精品人人做人人爽电影蜜月| 国产精品综合av一区二区| 国产国产午夜福利视频| 九九热爱视频精品| 亚洲午夜理论无码电影| 激情视频乱一区二区三区| 精品黄色av一区二区三区| 亚洲精品综合第一国产综合| 亚洲av无一区二区三区| 人妻aⅴ无码一区二区三区| 制服丝袜人妻有码无码中文字幕| 翘臀少妇被扒开屁股日出水爆乳| 日本韩国一区二区精品| 亚洲香蕉伊综合在人在线| 国产成人精品亚洲精品日日| 无码人妻精品一区二区三区蜜桃| 国产精品国产精品偷麻豆| 高清在线一区二区三区视频 | 中文字幕人妻中文AV不卡专区| 国产精品中文第一字幕| 亚洲人成亚洲人成在线观看| av网站免费线看精品| 国产日韩一区二区四季| 日韩精品一区二区av在线| 伊人成人在线视频免费| 国产色无码专区在线观看| 国产黄色一区二区三区四区| 日本中文字幕在线播放| XXXXXHD亚洲日本HD| 国产精品一二三区蜜臀av|