VUE-簡單Click事件過程

VUE的點(diǎn)擊事件我們都用過聂使,我們來看一下最簡單的click底層是如何實(shí)現(xiàn)的盐欺。

<div id="test1" @click="click1">click1</div>

vue初始化的時(shí)候泊柬,將method中的方法代理到vue[key]的同時(shí)修飾了事件的回調(diào)函數(shù)。綁定了作用域杂曲。

function initState (vm) {
  vm._watchers = [];
  var opts = vm.$options;
  if (opts.props) { initProps(vm, opts.props); }
  if (opts.methods) { initMethods(vm, opts.methods); }//1.在此初始化
  if (opts.data) {
    initData(vm);
  } else {
    observe(vm._data = {}, true /* asRootData */);
  }
  if (opts.computed) { initComputed(vm, opts.computed); }
  if (opts.watch) { initWatch(vm, opts.watch); }
}

我們再去看一下initMethods方法

function initMethods (vm, methods) {
  var props = vm.$options.props;
  for (var key in methods) {
    vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
    {
      if (methods[key] == null) {
        warn(
          "method \"" + key + "\" has an undefined value in the component definition. " +
          "Did you reference the function correctly?",
          vm
        );
      }
      if (props && hasOwn(props, key)) {
        warn(
          ("method \"" + key + "\" has already been defined as a prop."),
          vm
        );
      }
    }
  }
}

看一下bind方法通過返回函數(shù)修飾了事件的回調(diào)函數(shù)庶艾。綁定了事件回調(diào)函數(shù)的this。并且讓參數(shù)自定義

function bind (fn, ctx) {
  function boundFn (a) {
    var l = arguments.length;
    return l
      ? l > 1
        ? fn.apply(ctx, arguments)
        : fn.call(ctx, a)
      : fn.call(ctx)
  }
  boundFn._length = fn.length;
  return boundFn
}

當(dāng)VUE運(yùn)行編譯時(shí)會把div等原始元素變成ast并通過函數(shù)genHandler進(jìn)行處理
當(dāng) 事件函數(shù)有修飾符解阅,處理修飾符并添加修飾符對應(yīng)的函數(shù)語句

function genHandler (
  name,
  handler
) {
  if (!handler) {
    return 'function(){}'
  }

  if (Array.isArray(handler)) {
    return ("[" + (handler.map(function (handler) { return genHandler(name, handler); }).join(',')) + "]")
  }

  var isMethodPath = simplePathRE.test(handler.value);
  var isFunctionExpression = fnExpRE.test(handler.value);
  if (!handler.modifiers) {
  //返回沒有修飾符的回調(diào)函數(shù)
    return isMethodPath || isFunctionExpression
      ? handler.value
      : ("function($event){" + (handler.value) + "}") // inline statement
  } else {
//含有修飾符
    var code = '';
    var genModifierCode = '';
    var keys = [];
    for (var key in handler.modifiers) {
      if (modifierCode[key]) {
//處理修飾符數(shù)組
        genModifierCode += modifierCode[key];
        if (keyCodes[key]) {
          keys.push(key);
        }
      } else {
        keys.push(key);
      }
    }
    if (keys.length) {
      code += genKeyFilter(keys);
    }
    // Make sure modifiers like prevent and stop get executed after key filtering
    if (genModifierCode) {
      code += genModifierCode;
    }
    var handlerCode = isMethodPath
      ? handler.value + '($event)'
      : isFunctionExpression
        ? ("(" + (handler.value) + ")($event)")
        : handler.value;
    return ("function($event){" + code + handlerCode + "}")
  }
}

我們看看render函數(shù)div的代碼

_c('div',{attrs:{"id":"test1"},on:{"click":click1}},[_v("click1")]),_v(" ")

在瀏覽器渲染成最終dom時(shí)會調(diào)用核心函數(shù)

function add$1 (
  event,
  handler,
  once$$1,
  capture,
  passive
) {
  if (once$$1) {
    var oldHandler = handler;
    var _target = target$1; // save current target element in closure
    handler = function (ev) {
      var res = arguments.length === 1
        ? oldHandler(ev)
        : oldHandler.apply(null, arguments);
      if (res !== null) {
        remove$2(event, handler, capture, _target);
      }
    };
  }
  target$1.addEventListener(
    event,
    handler,
    supportsPassive
      ? { capture: capture, passive: passive }//此處綁定點(diǎn)擊事件
      : capture
  );
}

總結(jié):div元素元素添加了.native修飾符的事件落竹。最終EventTarget.addEventListener() 掛載事件

知行辦公,專業(yè)移動辦公平臺 https://zx.naton.cn/
【總監(jiān)】十二春秋之货抄,3483099@qq.com
【Master】zelo朱转,616701261@qq.com蟹地;
【運(yùn)營】狼行天下,897221533@qq.com藤为;
【產(chǎn)品設(shè)計(jì)】流浪貓怪与,364994559@qq.com
【體驗(yàn)設(shè)計(jì)】兜兜缅疟,2435632247@qq.com分别;
【iOS】淘碼小工,492395860@qq.com存淫;iMcG33K耘斩,imcg33k@gmail.com
【Android】人猿居士桅咆,1059604515@qq.com括授;思路的頓悟,1217022114@qq.com
【java】首席工程師MR_W荚虚,feixue300@qq.com薛夜;
【測試】土鏡問道,847071279@qq.com版述;
【數(shù)據(jù)】喜樂多梯澜,42151960@qq.com
【安全】保密渴析,你懂的晚伙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市檬某,隨后出現(xiàn)的幾起案子撬腾,更是在濱河造成了極大的恐慌,老刑警劉巖恢恼,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件民傻,死亡現(xiàn)場離奇詭異,居然都是意外死亡场斑,警方通過查閱死者的電腦和手機(jī)漓踢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漏隐,“玉大人喧半,你說我怎么就攤上這事∏嘣穑” “怎么了挺据?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脖隶。 經(jīng)常有香客問我扁耐,道長,這世上最難降的妖魔是什么产阱? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任婉称,我火速辦了婚禮,結(jié)果婚禮上构蹬,老公的妹妹穿的比我還像新娘王暗。我一直安慰自己,他們只是感情好庄敛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布俗壹。 她就那樣靜靜地躺著,像睡著了一般铐姚。 火紅的嫁衣襯著肌膚如雪策肝。 梳的紋絲不亂的頭發(fā)上肛捍,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音之众,去河邊找鬼拙毫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棺禾,可吹牛的內(nèi)容都是我干的缀蹄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼膘婶,長吁一口氣:“原來是場噩夢啊……” “哼缺前!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悬襟,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤衅码,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脊岳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝段,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年割捅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奶躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿驾,死狀恐怖嘹黔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莫瞬,我是刑警寧澤儡蔓,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站疼邀,受9級特大地震影響浙值,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檩小,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烟勋。 院中可真熱鬧规求,春花似錦、人聲如沸卵惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沮尿。三九已至丛塌,卻和暖如春较解,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赴邻。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工印衔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姥敛。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓奸焙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彤敛。 傳聞我的和親對象是個(gè)殘疾皇子与帆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容