国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解Element 指令clickoutside源碼分析

2024-05-06 15:42:23
字體:
來源:轉載
供稿:網友

clickoutside是Element-ui實現的一個自定義指令,顧名思義,該指令用來處理目標節點之外的點擊事件,常用來處理下拉菜單等展開內容的關閉,在Element-ui的Select選擇器、Dropdown下拉菜單、Popover 彈出框等組件中都用到了該指令,所以這個指令在實現一些自定義組件的時候非常有用。

要分析該源碼,首先要了解一下Vue的自定義指令。自定義指令的定義方式如下:

// 注冊一個全局自定義指令 Vue.directive('directiveName', { bind: function(el, binding, vnode){  // 當指令第一次綁定到元素時調用,常用來進行一些初始化設置 	... }, inserted: function(el, binding, vnode){  // 當被綁定的元素插入到 DOM 中時…… 	... }, update: function(el, binding, vnode, oldVnode){  // 所在組件的 VNode 更新時調用,但是可能發生在其子 VNode 更新之前 	... }, componentUpdated: function(el, binding, vnode, oldVnode){  // 指令所在組件的 VNode 及其子 VNode 全部更新后調用 	... }, unbind: function(el, binding, vnode){  // 只調用一次,指令與元素解綁時調用,類似于beforeDestroy的功能 	... }});

可以看到在配置對象中只有5個可選的鉤子函數,他們的參數有4個,分別是 el、binding、vnode、oldVnode

el :指令所綁定的元素,可以用來直接操作DOM binding : 一個包含了自定義詳細信息的對象,內部收集了使用自定義指令時傳入的值、修飾符、參數等數據,詳細信息可以在官方文檔見到,已經說的十分詳細了 vnode : Vue編譯生成的虛擬節點 oldVnode: 本次Vnode更新之前,上一次產生的虛擬節點,僅在  update  和  componentUpdated  鉤子中可用。

看完了自定義指令的內容,接下來我們就來分析clickoutside的具體實現。

import Vue from 'vue';import { on } from 'element-ui/src/utils/dom';const nodeList = [];const ctx = '@@clickoutsideContext';let startClick;let seed = 0;!Vue.prototype.$isServer && on(document, 'mousedown', e => (startClick = e));!Vue.prototype.$isServer && on(document, 'mouseup', e => { nodeList.forEach(node => node[ctx].documentHandler(e, startClick));});function createDocumentHandler(el, binding, vnode) { return function(mouseup = {}, mousedown = {}) {  ... };}let startClick;let seed = 0;export default { bind(el, binding, vnode) {  ... }, update(el, binding, vnode) {  ... }, unbind(el) {  ... }};

上面是簡化后的源碼,可以看到首先引入Vue和一個用來進行事件綁定的工具函數on,然后定義了兩個全局常量 nodeListctx 。nodeList 是一個 元素搜集器 ,會將頁面中所有綁定了clickoutside指令的dom元素存儲起來,而ctx定義了一個命名空間(必須比較特殊,防止和其它特性重名), 后面會將它添加為元素el的properties ,具體后面會分析到。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 苍山县| 镇江市| 祁门县| 赤壁市| 卓尼县| 宾川县| 元氏县| 济宁市| 丘北县| 双辽市| 顺昌县| 伽师县| 晴隆县| 安多县| 荔波县| 左贡县| 枣庄市| 响水县| 出国| 安乡县| 和龙市| 定州市| 宾阳县| 天水市| 信阳市| 彝良县| 侯马市| 宝山区| 固始县| 丽江市| 五家渠市| 奉化市| 泰顺县| 诸暨市| 禄劝| 北海市| 鄂托克旗| 华亭县| 正定县| 东辽县| 华亭县|