QWrap簡介之元件編寫
提醒:本文最後更新於 2746 天前,文中所描述的資訊可能已發生改變,請謹慎使用。
QWrap是一個BSD協議下的開源JS框架,前身是百度有啊WED團隊內部使用的BBlib。關於她的設計理念、核心架構,JK和月影兩位同學的部落格上有很多文章。這裡我簡單介紹下實際專案中,如何用QWrap開發元件。
動手之前,建議先看下這幾十篇QWrap介紹,對QWrap有個全面的瞭解。然後,通過git獲取JK分支的QWrap,或者從這裡下載最新主幹的zip包。QWrap官方版暫時還沒放元件,我們先選擇有元件的JK版,兩者核心庫是一致的。做完這些準備工作後,進入正題~
我們來做一個價格篩選器元件。需求是:給定最小值和最大值,通過拖動兩個滑塊讓使用者直觀地選擇價格區間。效果圖如下:
先不急著寫,想下怎麼實現。首先,拖動元素,要考慮很多因素,靠譜的辦法還是先看庫裡有寫好的沒,DRY原則。實際上,wagang目錄下有一個drag元件,封裝了常見的dragdrop行為,可以直接使用。另外,UI元件最重要的是合理且可擴充套件的html結構,這個就仁者見仁了。這裡給一種結構(點這裡預覽):
<div id="dualSilder1" class="price_graph" style="width: 212px;">
<span class="arr1"><span class="arr"></span></span>
<span class="arr2"><span class="arr"></span></span>
</div>
兩個.arr對應兩個滑塊,arr1和arr2分別是左右灰色區域。拖動滑塊,改變parent寬度,剛好符合drag元件提供的SimpleResize行為。剩下的事情就好辦了,開始動手吧~
進入QWrap程式碼的resource/js目錄。core、dom兩個目錄是核心庫,一般不直接引用;專案中通過apps/apps_wagang下的合併檔案引入核心庫;wagang是JK版元件所在目錄。我們新建一個my放自己的元件,元件暫且叫DualSlider,目錄層級大概是這樣:
core/dom/apps/apps_wagang...
wagang
└ panel...
my
└ dualsilder
├ dualsilder.js
├ _test (單元測試目錄)
└ _example (示例目錄)
我們選擇apps_wagang/qwrap_wagang.js作為核心庫檔案,完成元件程式碼。具體實現邏輯比較長,點這裡檢視,程式碼主體結構如下:
(function() {
var mix = ObjectH.mix,
createEvents = CustEvent.createEvents;
function DualSlider(opts) {
mix(this, opts, 1);
this._init();
};
//元件提供的自定義事件
DualSlider.EVENTS = ['drag', 'dragend'];
mix(DualSlider.prototype, {
container : null, //容器
width : 100, //拖動距離,單位px
startValue : 0,
endValue : 100,
//初始化引數
_init : function() {
...
createEvents(this, DualSlider.EVENTS);
this._render();
},
//繫結拖動事件
_render : function() {
...
},
//返回當前值
getValues : function() {
...
}
});
QW.provide('DualSlider', DualSlider);
var DualSilderH = {
dualSilde : function(el, opt) {
opt.container = el;
new DualSlider(opt);
}
};
QW.NodeW.pluginHelper(DualSilderH, 'operator');
})();
程式碼開始的靜態方法拷貝,有利於JS壓縮和元件solo。元件裡全都使用靜態方法還是Retouch後的方法,要看元件開發者的取捨了——靜態利於solo;retouch功能強大、書寫簡便——本例是用Retouch後的。接下來是建構函式和自定義事件宣告,一旦通過CustEvent.createEvents建立了自定義事件,就可以通過on、fire註冊和觸發相應的事件。
中間部分沒什麼特別的,通過mix把數組裡的方法和屬性加進元件prototype。接下來的provide,把元件繫結到特定的名稱空間。具體綁到哪兒,是在app對應的retouch檔案指定的,例如之前Youa是將所有元件綁到window下,用起來比較方便;也可以在retouch裡給元件加任意層名稱空間,避免與其它元件衝突,很自由。
接下來建立了DualSilderH,它是一個滿足Helper規範的物件。DualSilderH有一個dualSlide方法,第一個引數是el,我們把它加進NodeW,使得W出來的物件擁有這個方法,最後的operator表示dualSlide呼叫完,返回W本身,也就是傳說中的鏈式呼叫,如:
W('#dualSilder2').dualSilde({
width : 200,
startValue : 0,
endValue : 100
}).css('opacity', '.6');
這樣我們的元件基本算完工了,點這裡看Demo。可以看到,這個元件依賴於Drag,如果頁面上忘記引入Drag,它也就不能工作。有什麼辦法可以避免這種情況呢?這時候,輪到模組載入器出場了。
開啟apps_wagang下的modules_config.js,增加兩個模組:
Drag: {
url: '//wagang/drag/drag.js'
},
DualSlider: {
url: '//my/dualslider/dualslider.js',
require : 'Drag'
},
修改測試頁面,僅引入核心庫和modules_config.js,這樣使用元件:
QW.use('DualSlider', function() {
var s1 = new DualSlider({
container : '#dualSilder1',
width : 200,
startValue : 0,
endValue : 100
});
});
use會找到模組依賴,在所有依賴檔案載入完執行回撥函式,這樣就沒問題了。
到這裡,基於QWrap開發元件整個流程基本走完了。剩下的合併壓縮,可以統一交給工具來做,之後再做介紹。整個過程看似比較複雜,其實理解了QWrap的Helper+Wrap+Retouch+Apps機制後,就理解了這樣做的目的,也可以從中體會到程式碼應用上靈活自如的好處。
最後,如果需要給元件增加setValues方法,改變數值時需要動畫,又該怎麼實現呢?這裡有Demo,大家可以先自己嘗試下再看。
附:
--EOF--
提醒:本文最後更新於 2746 天前,文中所描述的資訊可能已發生改變,請謹慎使用。
相關推薦
QWrap簡介之元件編寫
提醒:本文最後更新於 2746 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 QWrap是一個BSD協議下的開源JS框架,前身是百度有啊WED團隊內部使用的BBlib。關於她的設計理念、核心架構,JK和月影兩位同學的部落格上有很多文章。這裡我簡單介紹下實際專案中,如何用QWrap開發元件。 動
QWrap簡介之核心庫定製
提醒:本文最後更新於 2661 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 圍觀過QWrap的同學可能會注意到其官方的特性介紹裡有這麼一條: 提供YUI2一樣的靜態方法庫,同時又用所謂的Helper規範來做到真正的絕對靜態,讓元件開發者可以釋出出無依賴的元件。 其中,元件無依賴化,也就是
react編寫規範之元件元件的內容編寫順序
1 static 開頭的類屬性,如 defaultProps、propTypes。 2 建構函式,constructor。 3 getter/setter(還不瞭解的同學可以暫時忽略)。 4 元件生命週期。 5 _ 開頭的私有方法。 6 事件監聽方法,handle*。 7 render*開頭的方法,有時
菜鳥上路之如何編寫python註冊模塊
當我 sans 切割 username 輸入 see put 註冊 1-1 我們先來確定下需求: 寫一個註冊的程序,輸入username,passwd,confirmpasswd 註冊成功之後,提示註冊成功,程序退出,要求用戶名不能重復 錯誤次數也是3次一.需求分析:需求
linux shell 之嘗試編寫 企業級 啟動腳本
nginx data err 企業級 開機自啟 註意 sbin 分享 fin 企業Shell面試題10:開發企業級MySQL啟動腳本 說明: MySQL啟動命令為: 1 /bin/sh mysqld_safe --pid-file=$mysqld_pid_
js學習總結----crm客戶管理系統之node編寫API接口
準備 獲取 ring length urn 使用 col asc ati 具體API代碼如下 var http = require(‘http‘), url = require(‘url‘), fs = require(‘fs‘); var server
Docker入門實踐之dokerfile編寫
DockerDockerfile是一個文本格式的配置文件,通過dockerfile可以快速創建自定義鏡像以適應測試,預發布,生產環境等各種應用部署鏡像,一個好的dockerfile可以讓我們的鏡像更方便管理以及應用。 一. Dokerfile的基本結構 Dockfile是由一行行命令語句組成,並且遲滯以#開頭
Docker入門實踐之dokerfile編寫(2)
docker前面我介紹到dockerfile的常用的指令,本篇將繼續講到dockerfile相關指令。 1. CMD 容器啟動命令 CMD 指令的格式和 RUN 相似,也是兩種格式: shell 格式:CMD <命令> exec 格式:CMD ["可執行文件", "參數1", "參數2"...]
Linux命令簡介之xargs
查找文件 rgs UC ls -l 用法示例 type args 令行 處理 今天開始總結下學到過的命令,主要自己學習使用。今天先總結下xargs xargs 向其他命令傳遞命令行參數的過濾器。選項-n 指定每行多少列-i 以{}代替前面的內容-d 指定分隔符
ActiveMQ SSL應用之四 編寫Java Demo類使用SSL連線ActiveMQ
一、主要內容 在Eclipse平臺編寫Java Demo類使用SSL連線ActiveMQ,並進行簡單的報文傳送,接收,並使用wireshark抓包工具對報文進行抓取分析。 二、Demo類 1、訊息生產者 package example; import javax.jms.C
Linux簡介之使用者管理常用命令
一、使用者和許可權 檢視某個目錄下檔案的詳細資訊:ls -l /home/user 每一列代表的含義: 1)許可權,第 1 個字元如果是 d 表示目錄,然後依次是使用者許可權、組許可權、其他使用者許可權 2)硬連結數,通俗地講,就是有多少種方式,可以訪問到當前目錄/檔案,比如,a下
Linux簡介之遠端管理常用命令
1、重啟電腦 $ shutdown -r now # 重新啟動作業系統,其中 now 表示現在 $ shutdown now # 立刻關機,其中 now 表示現在 $ shutdown 20:25 # 系統在今天的 20:25 會關機 $ shutdown +10 # 系統再
Linux簡介之常用命令
一、作業系統的作用 1.直接操作硬體 2.把操作硬體的程式碼封裝為系統呼叫,供其他程式設計師開發應用程式,間接地操作硬體。 二、linux的核心版本和發行版本 三、Linux 主要目錄 /:根目錄,一般根目錄下只存放目錄 /bin、/usr/bin:可執行二進位制檔案的目錄,如常用的命
資料採集與埋點簡介之 程式碼埋點、視覺化埋點與無痕埋點
博主做移動手機系統中的資料採集與埋點也有近兩年,那段時間內一方面是集中在具體的開發和問題細節處理,另外一方面則是在把採集系統適配到不同的平臺手機、平板、tv、車載的過程中,有Android和C++兩個版本。有一天見到了“神策資料”的這篇博文,發現總結得太好了,有點相見恨晚的感覺。這篇文章裡面闡述了一
012-Ambari二次開發之元件Zookeeper,Kafka,Hadoop編譯
Zookeeper是大資料生態圈元件之間協調的基礎元件。本篇我們開始編譯基於HDP3.0版本棧的Zookeeper。 關注微信公眾號,獲取更多內容 Zookeeper編譯 安裝ant,Zookeeper依賴於ANT編譯,所以需要安裝ant yum install ant
011-Ambari二次開發之元件編譯概述
Ambari元件即大資料生態圈的元件,如Hadoop,Zookeeper,HBase,Hive,Spark,Kafka等。當我們業務需要修改原始碼時,我們需要重新編譯打包元件。Ambari的元件包是以RPM包的形式存在的,並且Ambari元件包檔案路徑存放位置和原生方式安裝是不同的,所以我們
軟體測試之如何編寫單元測試用例
單元測試是以程式設計說明書為指導,測試模組範圍內的重要控制路徑,以揭露錯誤。 當程式編好以後,將它錄製在媒體上,或者直接由終端鍵盤輸入到機中進行除錯。測試的相對複雜性和所發現的錯誤受到單元測試所限定的範圍的限制。它在執行的過程中緊密的依照程式框架對模組進行測試(除錯),測試包含入口和出口的引數,輸入和輸出資
Vue之元件
Vue之全域性元件 全域性元件可以被任何區域性元件呼叫 <div id="app"> <!--這裡是元件的使用--> <global-component></global-component> </div> &l
部落格開發總結之頁面編寫
前面是一堆廢話,正文下拉!!! 學習Java斷斷續續也快兩年了(實際應該是一年多),從大學第一次接觸C語言,就發現自己其實是喜歡程式設計的。在高中的時候,聽說了C語言後就想要學習,覺得寫程式碼是一件很酷的事情,於是在網上找了一份教程,試著在命令列介面printf("hello,world");
React Native 筆記之元件
React Native的元件 什麼是React Native 元件? React Native 都有哪些元件? 建立元件的三種方式 [元件的生命週期](https://react.docschina.org/docs/react-compone