欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue中view-model雙向綁定基礎(chǔ)原理解析

 更新時間:2022年10月18日 14:40:03   作者:程序員勸退師  
這篇文章主要介紹了vue中view-model雙向綁定基礎(chǔ)原理,文中給大家介紹了vue雙向綁定的原理總結(jié),本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下

利用Object.defineProperty進行數(shù)據(jù)劫持

代碼如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue V-M</title>
</head>
<body>
  <div id="ap">
    <input id="input" type="text"><br/>
    <div id="text"></div><br/>
    <button id="button" type="button">打印</button>
  </div>
  <script>
    var input = document.querySelector('#input');
    var text = document.querySelector("#text");
    var button = document.querySelector("#button");
    var data = {value:''};

    Object.defineProperty(data, 'value', {
      get:function(){
        console.log('get value ',input.value);
        return input.value;
      },
      set:function(value){
        console.log('set value ',value);
        text.innerHTML = value;
        input.value = value;
      }
    });

    input.addEventListener("keyup", function (e) {
      data.value = e.target.value;
    }, false)

    button.addEventListener('click',function(e){
      console.log('data ',data);
    },false);
  </script>
</body>
</html>

vue雙向綁定的原理總結(jié)

MVVM

視圖模型雙向綁定,是Model-View-ViewModel的縮寫,也就是把MVC中的Controller演變成ViewModel。Model層代表數(shù)據(jù)模型,View代表UI組件,ViewModel是View和Model層的橋梁,數(shù)據(jù)會綁定到viewModel層并自動將數(shù)據(jù)渲染到頁面中,視圖變化的時候會通知viewModel層更新數(shù)據(jù)。以前是操作DOM結(jié)構(gòu)更新視圖,現(xiàn)在是數(shù)據(jù)驅(qū)動視圖。

優(yōu)點:
1.低耦合。視圖(View)可以獨立于Model變化和修改,一個Model可以綁定到不同的View上,當View變化的時候Model可以不變化,當Model變化的時候View也可以不變;
2.可重用性。你可以把一些視圖邏輯放在一個Model里面,讓很多View重用這段視圖邏輯。
3.獨立開發(fā)。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設(shè)計人員可以專注于頁面設(shè)計。
4.可測試。

數(shù)據(jù)(model)變化主動觸發(fā)ui(view)變化,同時ui(view)變化主動觸發(fā)數(shù)據(jù)(model)變化,當然這里的ui變化指定表單中的用戶輸入,可通俗的理解為:在單向綁定的基礎(chǔ)上給可輸入元素(input、textarea等)添加change(input)事件,來動態(tài)修改model和view

vue當中的雙向綁定

vue.js是采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter和getter,在數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)相應(yīng)的監(jiān)聽回調(diào)

使用 v-model / .sync 實現(xiàn),v-model是 v-bind:value 和 v-on:input 的語法糖

  • v-bind:value 實現(xiàn)了 data ⇒ UI 的單向綁定
  • v-on:input 實現(xiàn)了 UI ⇒ data 的單向綁定

引申出這兩個單向綁定如何實現(xiàn)

v-bind的實現(xiàn)

通過 Object.defineProperty API 給 data 創(chuàng)建 getter 和 setter,用于監(jiān)聽 data 的改變,data 一變就會安排改變 UI

v-on的實現(xiàn)

通過 template compiler 給 DOM 添加事件監(jiān)聽,DOM input 的值變了就會去修改 data。

Compile(指令解析器)

Compile主要做的事情是解析模板指令,將模板中變量替換成數(shù)據(jù),然后初始化渲染頁面視圖,并將每個指令對應(yīng)的節(jié)點綁定更新函數(shù),添加鑒定數(shù)據(jù)的訂閱者,一旦數(shù)據(jù)有變動,收到通知,更新視圖

Observer(數(shù)據(jù)監(jiān)聽器)

Observer的核心是通過Object.defineProprtty()來監(jiān)聽數(shù)據(jù)的變動,這個函數(shù)內(nèi)部可以定義setter和getter,每當數(shù)據(jù)發(fā)生變化,就會觸發(fā)setter。這時候Observer就要通知訂閱者,訂閱者就是Watcher

Watcher(訂閱者)

Watcher訂閱者作為Observer和Compile之間通信的橋梁,主要做的事情是:

  • 在自身實例化時往屬性訂閱器(dep)里面添加自己
  • 自身必須有一個update()方法
  • 待屬性變動dep.notice()通知時,能調(diào)用自身的update()方法,并觸發(fā)Compile中綁定的回調(diào)

到此這篇關(guān)于vue中view-model雙向綁定基礎(chǔ)原理的文章就介紹到這了,更多相關(guān)vue中view-model雙向綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue如何自定義封裝API組件

    vue如何自定義封裝API組件

    這篇文章主要介紹了vue如何自定義封裝API組件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 如何解決Vue3組合式API模式下動態(tài)組件不渲染問題

    如何解決Vue3組合式API模式下動態(tài)組件不渲染問題

    這篇文章主要介紹了如何解決Vue3組合式API模式下動態(tài)組件不渲染問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-03-03
  • vue2.0 循環(huán)遍歷加載不同圖片的方法

    vue2.0 循環(huán)遍歷加載不同圖片的方法

    下面小編就為大家分享一篇vue2.0 循環(huán)遍歷加載不同圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue3.2中setup語法糖的使用教程分享

    Vue3.2中setup語法糖的使用教程分享

    這篇文章主要為大家詳細介紹了Vue3.2中setup語法糖的具體使用方法,文中的示例代碼講解詳細,對我們深入了解Vue有一定的幫助,需要的可以參考一下
    2023-05-05
  • Vue+canvas實現(xiàn)水印功能

    Vue+canvas實現(xiàn)水印功能

    實際項目中偶爾會遇到給項目頁面背景加水印的需求,這篇文章主要為大家介紹了Vue使用canvas實現(xiàn)水印功能的示例代碼,希望對大家有所幫助
    2023-07-07
  • vue 中的動態(tài)傳參和query傳參操作

    vue 中的動態(tài)傳參和query傳參操作

    這篇文章主要介紹了vue 中的動態(tài)傳參和query傳參操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue 實現(xiàn)可拖曳的樹狀結(jié)構(gòu)圖

    vue 實現(xiàn)可拖曳的樹狀結(jié)構(gòu)圖

    這篇文章主要介紹了vue 實現(xiàn)可拖曳的樹狀結(jié)構(gòu)圖,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-04-04
  • vue3使用axios并封裝axios請求的詳細步驟

    vue3使用axios并封裝axios請求的詳細步驟

    本篇文章分步驟給大家介紹了vue3使用axios并封裝axios請求的詳細步驟,結(jié)合實例代碼給大家講解的非常詳細,需要的朋友參考下吧
    2023-06-06
  • vue3?emits事件使用示例詳解

    vue3?emits事件使用示例詳解

    這篇文章主要為大家介紹了vue3?emits事件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • vue中父子組件傳值,解決鉤子函數(shù)mounted只運行一次的操作

    vue中父子組件傳值,解決鉤子函數(shù)mounted只運行一次的操作

    這篇文章主要介紹了vue中父子組件傳值,解決鉤子函數(shù)mounted只運行一次的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論