最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue2?模版指令元素綁定事件執(zhí)行順序解析

 更新時間:2022年08月26日 11:58:29   作者:JunIce  
這篇文章主要為大家介紹了Vue2?模版指令元素綁定事件執(zhí)行順序解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Vue 自定義指令的執(zhí)行機制

version: 2.6.14

前情提要

某日,業(yè)務需要我需要在按鈕點擊之前驗證某些條件,如果不符合即不執(zhí)行click內的業(yè)務代碼。思前想后,寫一個指令不就可以了。做到既不改動原有的業(yè)務代碼,又可以移植。

<template>
  <button v-capture @click="handleClick">button</button>
</template>
<script>
  export default {
    methods: {
      handleClick(){
        console.log(1)
      }
    },
    directives: {
      capture: {
        bind(el) {
          el.captureHandler = (e) => {
            // 驗證條件
            console.log(2)
            e.stopPropagation()
          };
          el.addEventListener("click", el.captureHandler);
        },
        unbind(el) {
          el.removeEventListener("click", el.captureHandler);
        }
      }
    }
}
</script>

以上就是偽代碼,乍一看沒啥問題。

實際一運行,發(fā)現1和2都打印出來了,而且1還是在2之前運行的。

這樣一看模版上綁定的事件執(zhí)行是在自定義指令綁定事件之前的。

翻開谷歌,也沒有找到相關案例。

DOM綁定

我們都知道vue的SFC最終還是會被編譯成js文件,最終模板會被編譯成vnode,

元素上綁定的事件會轉換成vnode上的一個對象

{
  // ....
  on: {
    click: 'handleClick'
  }
}

源碼

那就找一找這個對象在哪邊使用的

runtime中搜索addEventListener, 因為這個事件綁定上DOM中才有的事件,所以只會在web中了

// src/platforms/web/runtime/modules/events.js
export default {
  create: updateDOMListeners,
  update: updateDOMListeners,
  destroy: (vnode: VNodeWithData) => updateDOMListeners(vnode, emptyNode)
}

具體實現就先不管

updateDOMListeners中通過調用了updateListeners方法,把事件綁定到元素上去

還有就是返回了一個對象,包括create、update、destroy, 這不是很像vue的生命周期函數命名嘛

根據文件依次向上找??

最終在modules/index.js中導出了

export default [
  attrs,
  klass,
  events,
  domProps,
  style,
  transition
]

modules最終在哪里使用的?

就是大名鼎鼎的patch.js

// src/core/vdom/patch.js

const { modules, nodeOps } = backend

for (i = 0; i < hooks.length; ++i) {
  cbs[hooks[i]] = []
  for (j = 0; j < modules.length; ++j) {
    if (isDef(modules[j][hooks[i]])) {
      cbs[hooks[i]].push(modules[j][hooks[i]])
    }
  }
}

函數一上來就把modules進行分類,把原來modules上的相關的對象進行合并,

最終cbs會變成一個對象

const cbs = {
  create: [fn1, fn2, fn3],
  update: [fn1, fn2, fn3],
  destroy: [fn1, fn2, fn3],
}

具體的執(zhí)行的時機就不說了

directive

指令是vue的一大特色了,源于angularjs中就有指令這個東西了,vue3中依舊保留了下來

指令中對應以下幾個方法,也可以說是生命周期了

directives: {
  name: {
		bind(){},
    insert(){},
    inserted(){},
    componentUpdated(){},
    update(){},
    unbind(){},
  }
}

接下來找找指令是什么時候初始化的

全局查找directives, 其實就這一個文件,那就是它了

// src/core/vdom/modules/directives.js
{
  create: updateDirectives,
  update: updateDirectives,
  destroy: function unbindDirectives (vnode: VNodeWithData) {
    updateDirectives(vnode, emptyNode)
  }
}

可以明顯看到它也是在create內部周期上調用了bind方法了

callHook(dir, 'bind', vnode, oldVnode)

為什么先調用模版綁定的方法,再調用指令的方法

回到patch.js, 可以看到模塊在這里進行了合并,把平臺相關的模塊放在前面,基礎指令和ref放在后面執(zhí)行了。

同時官方也進行了注釋,先執(zhí)行內置的方法再執(zhí)行指令的方法。

// src/platforms/web/runtime/patch.js
import baseModules from 'core/vdom/modules/index'
import platformModules from 'web/runtime/modules/index'

// the directive module should be applied last, after all
// built-in modules have been applied.
const modules = platformModules.concat(baseModules)

還是注釋沒仔細看,這個文件打開過多少次了。??

改了就可以了嗎

依舊不行。

問題就在addEventListener身上

拋開vue,看demo

const btn = document.querySelector('#btn')
btn.addEventListener('click', () => {
  console.log(1)
})
btn.addEventListener('click', () => {
  console.log(2)
})

總結

HTML 元素重復綁定同一個事件,后者并不會覆蓋前面的,只會有綁定的先后順序

那之前的問題還能解么

在捕獲階段執(zhí)行事件, 如果不符合條件,則停止事件傳遞。

el.addEventListener("click", el.captureHandler, true);

并且stopImmediatePropagation還用不了

stopImmediatePropagation可以阻止元素上綁定的其他事件,但是也是按添加順序,阻止之后的事件執(zhí)行

以上就是Vue2 模版指令元素綁定事件執(zhí)行順序解析的詳細內容,更多關于Vue2 事件執(zhí)行順序的資料請關注腳本之家其它相關文章!

相關文章

  • 使用vue和element-ui上傳圖片及視頻文件方式

    使用vue和element-ui上傳圖片及視頻文件方式

    這篇文章主要介紹了使用vue和element-ui上傳圖片及視頻文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue引用json文件的方法小結

    vue引用json文件的方法小結

    這篇文章主要介紹了vue引用json文件,解決怎么從控制臺把數據移到json文件中,只需要直接右擊復制值即可,需要的朋友可以參考下
    2022-09-09
  • Vue3中props傳參方式詳解

    Vue3中props傳參方式詳解

    這篇文章主要為大家詳細介紹了Vue3中props傳參方式(多種數據類型傳參方式)的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • 基于vue-upload-component封裝一個圖片上傳組件的示例

    基于vue-upload-component封裝一個圖片上傳組件的示例

    這篇文章主要介紹了基于vue-upload-component封裝一個圖片上傳組件的示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Vue2 Element el-table多選表格控制選取的思路解讀

    Vue2 Element el-table多選表格控制選取的思路解讀

    這篇文章主要介紹了Vue2 Element el-table多選表格控制選取的思路解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • :visible.sync 的作用詳解

    :visible.sync 的作用詳解

    我們在前端開發(fā)中經常看到:visible.sync這種修飾符,很多人不知道這是干什么的,在使用ElementUI的時候,里面有個彈窗el-dialog組件的時候會有用到:visible.sync,今天小編帶領大家學習下:visible.sync 的作用,感興趣的朋友一起看看吧
    2022-11-11
  • 基于vue實現微博三方登錄流程解析

    基于vue實現微博三方登錄流程解析

    這篇文章主要介紹了基于vue實現微博三方登錄流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • vue3+ts+vite使用el-table表格渲染記錄重復情況

    vue3+ts+vite使用el-table表格渲染記錄重復情況

    這篇文章主要給大家介紹了關于vue3+ts+vite使用el-table表格渲染記錄重復情況的相關資料,我們可以通過合并渲染、數據緩存或虛擬化等技術來減少重復渲染的次數,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 詳解Vue 多級組件透傳新方法provide/inject

    詳解Vue 多級組件透傳新方法provide/inject

    這篇文章主要介紹了詳解Vue 多級組件透傳新方法provide/inject,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 深入淺析Vue中的Prop

    深入淺析Vue中的Prop

    Prop的基本用法很簡單,只需要在子組件的Vue實例中定義該屬性并把值設為目標屬性的數組即可。這篇文章主要介紹了Vue中的Prop ,需要的朋友可以參考下
    2018-06-06

最新評論

桃源县| 苍梧县| 郯城县| 屏山县| 莫力| 民丰县| 蒙阴县| 湖口县| 桂阳县| 平定县| 尼勒克县| 盐边县| 巴马| 彭州市| 长岛县| 罗源县| 红桥区| 大冶市| 澜沧| 巫山县| 昭平县| 辉南县| 长岭县| 文水县| 临湘市| 舒兰市| 庆元县| 阳新县| 饶河县| 兴山县| 呈贡县| 华阴市| 棋牌| 福州市| 博兴县| 曲阳县| 虞城县| 绵竹市| 昆山市| 宝清县| 临沧市|