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

詳解vue v-model

 更新時間:2020年08月31日 11:13:13   作者:晨暮  
這篇文章主要介紹了vue v-model的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下

1. v-model原理

vue中v-model是一個語法糖,所謂的語法糖就是對其他基礎(chǔ)功能的二次封裝而產(chǎn)生的功能。簡單點說,v-model本身就是父組件對子組件狀態(tài)以及狀態(tài)改變事件的封裝。其實現(xiàn)原理上分為兩個部分:

通過props設(shè)置子組件的狀態(tài)
通過監(jiān)聽子組件發(fā)出的事件改變父組件的狀態(tài),從而影響子組件的props值
通過以上兩個部分,實現(xiàn)了父組件的狀態(tài)和子組件狀態(tài)進行了綁定的效果。

1.1 demo

v-model使用示例

<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8" />
 <title>v-model示例</title>
 <script type="text/javascript" src="vue.js"></script>
 </head>

 <body>
 <div id="app">
 <div>這里是父組件的狀態(tài):</div>
 <div style="margin-bottom: 15px;">{{content}}</div>
 <Child v-model="content"></Child>
 </div>

 <template id="input">
 <div>
 <div>這里是子組件的輸入?yún)^(qū)域:</div>
 <input :value="value" @input="contentChange" />
 </div>
 </template>

 <script type="text/javascript">
 var Child = {
 template: "#input",
 props: {
 value: {
 type: String,
 required: true
 }
 },
 methods: {
 contentChange(value){
 this.$emit("input", value.target.value);
 }
 }
 };

 var vueInstance = new Vue({
 el: "#app",
 components: {Child},
 data: {
 content: ""
 }
 })
 </script>
 </body>
</html>

在瀏覽器中打開上述html頁面,可以看到實時效果:在子組件中的input框中輸入內(nèi)容可以在父組件區(qū)域?qū)崟r顯示,達到了子組件中狀態(tài)和父組件狀態(tài)實時綁定的效果。

2. 修改v-model默認監(jiān)聽的事件和設(shè)置prop的名稱

v-model指令默認是在子組件上設(shè)置的prop名稱是value,默認監(jiān)聽子組件上的input事件,在上面的demo上,如果我們修改子組件contentChange函數(shù)中發(fā)出的事件名稱,在父組件中就無法實時獲取到子組件的輸入。

Vue中提供了通過在子組件上定義model屬性來修改這兩個參數(shù)名稱的功能,不過該功能需要在版本2.2以上才能使用,如下demo所示:

2.1 demo

<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8" />
 <title>v-model示例</title>
 <script type="text/javascript" src="vue.js"></script>
 </head>

 <body>
 <div id="app">
 <div>這里是父組件的狀態(tài):</div>
 <div style="margin-bottom: 15px;">{{content}}</div>
 <Child v-model="content"></Child>
 </div>

 <template id="input">
 <div>
 <div>這里是子組件的輸入?yún)^(qū)域:</div>
 <input :value="content" @input="contentChange" />
 </div>
 </template>

 <script type="text/javascript">
 var Child = {
 template: "#input",
 model: {
 prop: "content",
 event: "contentChanged"
 },
 props: {
 content: {
 type: String,
 required: true
 }
 },
 methods: {
 contentChange(value){
 this.$emit("contentChanged", value.target.value);
 }
 }
 };

 var vueInstance = new Vue({
 el: "#app",
 components: {Child},
 data: {
 content: ""
 }
 })
 </script>
 </body>
</html>

3. Vue中對v-model指令處理分析

基于Vue2.0版本,分析我們在標簽上寫上v-model屬性到vue組件實現(xiàn)響應(yīng)的流程。

3.1 解析部分

3.1.1 在將HTML解析稱AST時,會解析HTML中標簽的屬性

function processAttrs(el){
 ...
 name = name.replace(dirRE, '')
 // parse arg
 const argMatch = name.match(argRE)
 if (argMatch && (arg = argMatch[1])) {
 name = name.slice(0, -(arg.length + 1))
 }
 addDirective(el, name, value, arg, modifiers)
 ...
}

提取指令的名稱,v-model的指令名稱name為model,然后添加到實例的指令中

3.1.2 將指令相關(guān)內(nèi)容添加到實例指令中

export function addDirective (
 el: ASTElement,
 name: string,
 value: string,
 arg: ?string,
 modifiers: ?{ [key: string]: true }
) {
 (el.directives || (el.directives = [])).push({ name, value, arg, modifiers })
}

在實例的指令屬性中添加相應(yīng)的指令,這樣就實現(xiàn)了從html上的屬性到Vue實例上指令格式的轉(zhuǎn)換

3.2 指令設(shè)置部分

在將html解析稱AST之后,實例對應(yīng)的directives屬性上就有了我們設(shè)置的v-model相關(guān)的值,包括參數(shù)值value,name是model

3.2.1 調(diào)用指令的構(gòu)造函數(shù)

function genDirectives (el: ASTElement): string | void {
 const dirs = el.directives
 if (!dirs) return
 let res = 'directives:['
 let hasRuntime = false
 let i, l, dir, needRuntime
 for (i = 0, l = dirs.length; i < l; i++) {
 dir = dirs[i]
 needRuntime = true
 const gen = platformDirectives[dir.name] || baseDirectives[dir.name]
 if (gen) {
 // compile-time directive that manipulates AST.
 // returns true if it also needs a runtime counterpart.
 needRuntime = !!gen(el, dir, warn)
 }
 ...
}

在v-model指令的構(gòu)造函數(shù)中會根據(jù)tag的種類進行不同的創(chuàng)建函數(shù)進行創(chuàng)建,如果我們自定義指令需要在子組件上添加屬性,也需要在這個函數(shù)里面進行操作

3.2.2 普通tag下的v-model指令構(gòu)造過程

function genDefaultModel 
 el: ASTElement,
 value: string,
 modifiers: ?Object
): ?boolean {
 ...
 addProp(el, 'value', isNative ? `_s(${value})` : `(${value})`)
 addHandler(el, event, code, null, true)
 ...
}
  • addProp在el上設(shè)置一個名稱為value的prop,同時設(shè)置其值
  • addHandler在el上設(shè)置事件處理函數(shù)

3.3 指令響應(yīng)變化部分

3.3.1 createPatchFunction統(tǒng)一處理指令的鉤子函數(shù)
createPatchFunction函數(shù)返回一個patch函數(shù),在patch處理過程中,會調(diào)用指令的鉤子函數(shù),包括:

  • bind
  • inserted
  • update
  • componentUpdated
  • unbind

4. 總結(jié)

4.1 編譯過程

  1. 從html上解析所設(shè)置的指令
  2. 通過gen*函數(shù)將指令設(shè)置到AST上
  3. 調(diào)用指令的構(gòu)造函數(shù),設(shè)置指令需要在編譯時期處理的事情

4.2 初始化過程

通過在patch函數(shù)中,調(diào)用統(tǒng)一的鉤子函數(shù),觸發(fā)指令的鉤子函數(shù),實現(xiàn)相應(yīng)的功能

以上就是詳解vue v-model的詳細內(nèi)容,更多關(guān)于vue v-model的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue2響應(yīng)式系統(tǒng)之set和delete

    Vue2響應(yīng)式系統(tǒng)之set和delete

    這篇文章主要介紹了Vue2響應(yīng)式系統(tǒng)之set和delete,通過為對象收集依賴,將對象、數(shù)組的修改、刪除也變成響應(yīng)式的了,同時為用戶提供了和方法,下文詳細介紹需要的朋友可以參考一下
    2022-04-04
  • Vue computed計算屬性總結(jié)記錄

    Vue computed計算屬性總結(jié)記錄

    在vue中,有時候你需要對data中的數(shù)據(jù)進行處理,或者對抓取的數(shù)據(jù)進行處理之后再掛載呈現(xiàn)到標簽中,這時候你就需要計算屬性了,當然看到這里你可能還是不了解那下面我舉幾個實例并附代碼解釋
    2023-02-02
  • Vue2的路由和異步請求方式

    Vue2的路由和異步請求方式

    這篇文章主要介紹了Vue2的路由和異步請求方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue3中的setup使用和原理解析

    vue3中的setup使用和原理解析

    這篇文章主要介紹了vue3的setup的使用和原理解析,通過本文我們學(xué)習(xí)了?setup?函數(shù)執(zhí)行的過程及?Vue?是如何處理捕獲?setup?的返回結(jié)果的,需要的朋友可以參考下
    2022-09-09
  • Nuxt引用cookie-universal-nuxt在服務(wù)端請求cookie方式

    Nuxt引用cookie-universal-nuxt在服務(wù)端請求cookie方式

    這篇文章主要介紹了Nuxt引用cookie-universal-nuxt在服務(wù)端請求cookie方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue實現(xiàn)導(dǎo)出Word文件(數(shù)據(jù)流方式)

    vue實現(xiàn)導(dǎo)出Word文件(數(shù)據(jù)流方式)

    這篇文章主要介紹了vue實現(xiàn)導(dǎo)出Word文件(數(shù)據(jù)流方式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Vue3中的動畫過渡實現(xiàn)技巧分享

    Vue3中的動畫過渡實現(xiàn)技巧分享

    在現(xiàn)代的前端開發(fā)中,用戶體驗的重要性不言而喻,為了讓應(yīng)用程序更加生動和引人注目,動畫和過渡效果是必不可少的元素,本文將以 Vue3 為基礎(chǔ),深入探討如何在應(yīng)用程序中實現(xiàn)動畫過渡,以及一些技巧和最佳實踐,需要的朋友可以參考下
    2025-01-01
  • ElementUI多個子組件表單的校驗管理實現(xiàn)

    ElementUI多個子組件表單的校驗管理實現(xiàn)

    這篇文章主要介紹了ElementUI多個子組件表單實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue實現(xiàn)分頁加載效果

    vue實現(xiàn)分頁加載效果

    這篇文章主要為大家詳細介紹了vue實現(xiàn)分頁加載效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Vue Router深扒實現(xiàn)原理

    Vue Router深扒實現(xiàn)原理

    在看這篇文章的幾點要求:需要你先知道Vue-Router是個什么東西,用來解決什么問題,以及它的基本使用。如果你還不懂的話,建議上官網(wǎng)了解下Vue-Router的基本使用后再回來看這篇文章
    2022-09-09

最新評論

威信县| 吐鲁番市| 正镶白旗| 阿鲁科尔沁旗| 凭祥市| 榆树市| 南澳县| 大同县| 陈巴尔虎旗| 科技| 奉贤区| 上虞市| 延寿县| 承德县| 通道| 苗栗县| 清镇市| 景德镇市| 东海县| 达日县| 翁源县| 望江县| 两当县| 商水县| 历史| 远安县| 禹州市| 昌乐县| 沙湾县| 枣阳市| 库车县| 沭阳县| 息烽县| 营口市| 汝城县| 鄂尔多斯市| 汉中市| 秭归县| 拉萨市| 周至县| 宝清县|