Vue自定義指令實現v on及v model

2021-10-11 03:17:50 字數 2755 閱讀 9774

鉤子函式引數

感謝閱讀

tips: 如果你已了解自定義指令的基本使用,想知道它到底能做什麼,請直接看案例。如果你還不清楚自定義指令是什麼,可以翻到部落格後面看一些簡介

我們來模仿v-on實現乙個簡易的v-on,我們叫他v-coder,執行前請先引入vue2.x

>

"myclick"

>

}<

/div>

<

/div>

// 先是在全域性定義乙個指令 v-coder

vue.

directive

('coder'

,(el, binding)

=>

// 我們通過expression知道使用者想要執行哪乙個方法,於是我們呼叫這個方法

// 我們需要通過vnode.context來獲取使用此指令的上下文,也就是vue例項物件

vnode.context[binding.expression]()

}}})

// 乙個勉強能用的自定義指令就這麼建立完成了

newvue(,

methods:,}

,})<

/script>

我們來實現乙個v-model,我們還是叫他v-coder,為什麼還叫v-coder…沒有為什麼!

// 實際上我們可以只用到bind&update階段,所以我們可以簡化以下**

>

"text" v-coder=

"iptval"

/>

"changeiptval"

>iptval減一<

/button>

iptval:

}<

/div>

<

/div>

vue.

directive

('coder'

,(el, binding, vnode)

=>

// 實現元素修改後對資料的修改 vnode.context記錄當前的上下文,也就是例項物件

el.addeventlistener

(binding.eve,

function()

)// 實現資料改變後檢視的改變

el.value = binding.value

})newvue(,

methods:,}

,})<

/script>

// 註冊乙個全域性自定義指令 `v-color`

vue.

directive

('color',}

)

在元件內自定義指令

components:

,inserted

(el, binding, vnode)

,update

(el, binding, vnode),}

,},}

,},

如果不需要使用鉤子函式,可以簡化為以下,則會在bind&update階段幫你準備好指令

我們一般都是在bind和update裡來做一些必要操作,所以簡寫形式很常用

vue.

directive

('color'

,function

(el, binding)

)

只呼叫一次,指令第一次繫結到元素時呼叫。在這裡可以進行一次性的初始化設定。

被繫結元素插入父節點時呼叫 (僅保證父節點存在,但不一定已被插入文件中),也就是當父節點被渲染成功後就會觸發。

所在元件的 vnode 更新時呼叫,但是可能發生在其子 vnode 更新之前。指令的值可能發生了改變,也可能沒有。可以理解為當父節點發生變化時會觸發的鉤子。

指令所在元件的 vnode及其子 vnode全部更新後呼叫。可以理解為當父節點及其本身都發生變化時會觸發的鉤子。

只呼叫一次,指令與元素解綁時呼叫。

指令所繫結的元素,可以用來直接操作dom。

物件中有以下屬性,記錄著我們需要的一些資料。

name指令名不包括v-字首 例:v-color, name儲存的就是color

value指令繫結的值 例:v-color=「1+1」 ,value儲存的就是2

oldvalue指令繫結的前乙個值 ,也就是當指令繫結的值被改變後,oldvalue會保留上乙個存在的值

expression指令繫結的表示式 例:v-color=「1+1」 ,value儲存的就是1+1

arg傳給指令的引數,例 v-color:foo=「foolish」,arg儲存的就是foo

modifiers: 包含修飾符的物件,例 v-color:foo.big.circle=「foolish」 modifiers保留的就是

vue編譯生成的虛擬節點。記錄著與dom元素相關的屬性,我們後面的案例會用到vnode.context,這個屬性記錄著當前使用指令的上下文,也就是vue的例項物件

上乙個虛擬節點,僅在update和componentupdated鉤子中可用。

這裡我們只討論binding這個物件,我們只講究實用性,關於vnode和oldvnode,有機會我們再**。

Vue 通過自定義指令回顧 v 內建指令

vue.js 的各種指令 directives 更加方便我們去資料驅動 dom,例如 v bind v on v model v if v for v once 等內建指令,這些指令的職責就是當表示式改變時將某些行為應用到 dom 上,盡量不去操作增刪改 dom。通過了解如何去自定義指令,可以想象內...

vue自定義指令實現v model

指令是vue中非常重要的內容,了解指令的用法可以更好的服務於業務場景,方便高效,本文主要介紹指令的基本概念和用法,簡單模擬v model實現的功能。除了內建指令,vue.js 也允許註冊自定義指令。自定義指令提供一種機制將資料的變化對映為 dom 行為。可以用vue.directive id,def...

Vue自定義指令

vue有很多內建的指令,比如說v on,v model,v clock等等,每乙個指令會完成一定的功能,但是這些內建的指令總會有些侷限性,要是能夠自定義指令就好了 vue的自定義指令分類 全域性指令和區域性指令 vue指令的定義和用法 以全域性指令為例 1.語法 vue.directive 指令id...