JS實現Vue雙向綁定命令-下

2021-01-07 源碼時代

之前我們講到js實現Vue雙向綁定命令,需要將任務分解為三步:

1、輸入框以及文本節點與 data 中的數據綁定

2、輸入框內容變化時,data 中的數據同步變化。即 view => model 的變化。

3、data 中的數據變化時,文本節點的內容同步變化。即 model => view 的變化

上一篇內容中,我們已經完成第一步,成功將data中的數據綁定到輸入框與文本節點中,在這一篇,我們將會實現第二、第三步。在這裡我們將會使用到defineProperty與訂閱/發布模式。

2.2響應式的數據綁定

我們先來看一下任務二的實現思路:當我們在輸入框輸入數據的時候,首先會觸發input事件(或者keyup,change事件),在相應的事件處理程序中,我們獲取輸入框的Value並複製給vm實例的text屬性。我們會利用defineProperty 將 data 中的 text 設置為 vm 的訪問器屬性,因此給 vm.text 賦值,就會觸發 set 方法。在 set 方法中主要做兩件事,第一是更新屬性的值,第二留到任務三再說。

成好了,vm實例中的text屬性值戶與輸入框內容同步變化。

text屬性變化了,set方法觸發了,但是文本節點內容還沒有發生變化。如何讓同樣綁定到text的文本節點也同步變化?這裡我們將會使用到我們提到的訂閱/發布模式(subscribe&publish)/sb'skrab/ /'pbl/,接下來我們將會簡單的介紹訂閱/發布模式。

-訂閱/發布模式(subscribe&publish)

訂閱發布模式(又稱之為觀察者模式)定義了一種一對多的關係,讓多個觀察者同時監聽某一個主題對象,這個主題對象的狀態發生改變時,就會通知所有的觀察者對象。

發布者發出通知 => 主題對象收到通知並推送給訂閱者 => 訂閱者執行相應的操作

代碼地址:

https://github.com/Melody-YW/JavaScript/blob/master/Js%E5%AE%9E%E7%8E%B0vue%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A/subscribe%26publish.html

之前提到的,當set方法觸發後做的第二件事就是作為發布者發出通知「我是屬性text,我變了」。文本節點作為訂閱者,在收到消息後執行相應的更新操作。

2.3雙向綁定的實現

回顧一下,每當new Vue時,我們主要做了兩件事:第一個是監聽數據:observe(data),第二個是編譯HTML:nodeToFragment(id)。

在監聽數據的過程中,會為data中的每一個屬性生成一個主題對象dep。

在編譯HTML過程中,會為每個與數據綁定的相關節點生成一個訂閱者watcher,watcher會將自己添加到相應的屬性dep中。

我們已經實現:修改輸入框內容 => 在事件會掉函數中修改屬性值 => 觸發屬性的set方法

接下來我們要實現的是:發出通知 dep.notify( ) => 觸發訂閱者的update方法 => 更新視圖

這裡的關鍵邏輯是:如何將watcher添加到關聯屬性的dep中?

你是否已經有好的思路去實現呢?如果沒有,fllow me!

在編譯HTML國政中,為每個與data關聯的節點生成一個Watcher。Watcher函數中應該發生什麼呢?

先將自己賦給一個全局變量Dep.target;

其次,執行了update方法,進而執行了get方法,get方法讀取了vm的訪問器屬性,從而觸發了訪問器屬性的get方法,get方法中將該watcher添加到了對應訪問器屬性的dep中;

再次,獲取屬性的值,然後更新視圖。

最後,將Dep.target設為空,因為它是全局變量,也是watcher與dep關聯的唯一橋梁,任何時刻都必須保證Dep.target只有一個值。

到這裡,hello world雙向綁定就基本實現了,文本內容戶隨著輸入框內容同步變化,並在控制器中修改vm.text的值。

你的代碼實現功能了嗎?

小編提供了完整的代碼供小夥伴參考:

https://github.com/Melody-YW/JavaScript/blob/master/Js%E5%AE%9E%E7%8E%B0vue%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A/mvvm.html

預祝小夥伴在代碼界更上一層樓,更對技術文章敬請關注源碼時代。

相關焦點

  • 【Vue.js 入門到實戰教程】01-Vue.js 數據綁定的基本實現和代碼分析
    Vue.js 是一個典型的 MVVM(Model-View-ViewModel)模型框架,MVVM 由 MVC 演化而來(相關細節可參考 MVC,MVP 和 MVVM 的圖示):View 的變動,會自動更新到 ViewModel,反之亦然,這種機制叫做雙向綁定。
  • 手寫 Vue3 數據雙向綁定 理解Proxy
    雖然data 對象已經發生變化,但是它並不能觸發一些其他操作;我們來看看vue的雙向綁定<div id="Foo">    <h2>hello {{msg}}</h2>    <input type="text" v-model="msg"></div>
  • Vue面試題(2)雙向數據綁定,MVVM
    1、vue的雙向綁定的原理是什麼?vue.js是採用數據劫持結合發布者-訂閱者模式的方式,通過ES5提供的Object.defineProperty()方法來劫持(監視)各個屬性的setter,getter,在數據變動的時發布消息給訂閱者,觸發相應的監聽回調。並且,由於是在不同的數據上觸發同步,可以精確的將變更發送發送給綁定的視圖,而不是對所有的數據都執行一次檢測。
  • Vue.js以業務為中心的常見面試題
    在vue.js中的MVVM模式:vue.js是通過數據驅動的,vue.js實例化對象將dom和數據進行綁定,一旦綁定,dom和數據將保持同步,每當數據發生變化,dom也會隨著變化;ViewModel是Vue.js的核心,它是Vue.js的一個實例。
  • 「Vue.js開發連載一」Vue.js簡介
    一、簡介Vue.js(讀音 /vju/,類似於view)是一個構建數據驅動的web界面的漸進式框架。Vue。js的目標是通過儘可能簡單的API實現響應的數據綁定和組合的視圖組件。它不僅易於上手,還便於與第三方庫或既有項目整合。
  • 【分享】Vue.js新手入門指南
    換句話說,p標籤裡面通過{{ message }}這個寫法與input標籤中的value綁定在了一起,其中變化,另外一個和它綁定的數據就跟著變化。結合標題來說,就是vue.js會自動響應數據的變化情況,並且根據用戶在代碼中預先寫好的綁定關係,對所有綁定在一起的數據和視圖內容都進行修改。
  • 【項目推薦】Vue.js
    作者是尤雨溪,寫下這篇文章時 vue.js版本為 1.0.7 。我推薦使用 sublime text 作為編輯器,關於這個編輯器可以看我這篇文章。new Vue({ el:'#app', data: { message:'hello vue.js.' }});在使用 Vue.js 之前,我們需要先像這樣實例化一個 Vue 對象:就像 HelloWorld 展示的那樣,app.html 是 view 層,app.js 是 model 層,通過 vue.js(使用 v-model
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    實現的方式是:數據綁定。二是將【視圖】轉化成【模型】,即將所看到的頁面轉化成後端的數據。實現的方式是:DOM 事件監聽。這兩個方向都實現的,我們稱之為數據的雙向綁定。總結:在MVVM的框架下視圖和模型是不能直接通信的。
  • [前端]分別原生JS和Vue實現計數器功能
    題目用vue實現計數器功能,其中vue實現的代碼由黑馬程式設計師vue教程給出,這裡對其CSS代碼進行了注釋
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫: 只能實現數據的單向綁定。
  • Vuejs基礎之:實例、模板、計算、class與Style綁定
    請只對可信內容使用 HTML 插值,絕不要對用戶提供的內容插值•也可以使用{{{}}}來輸出真正的HTML2.1.3   屬性•v-bind:  html中元素的屬性,如果需要綁定到Vue.js上,則需要使用v-bind來進行綁定。•縮寫: :•用法:動態的綁定一個或多個特性,或一個組件的prop到表達式。
  • Vue.js 父子組件通信的十種方式
    無可否認,現在無論大廠還是小廠都已經用上了 Vue.js 框架,簡單易上手不說,教程詳盡,社區活躍,第三方套件還多。真的是前端開發人員必備技能。而且在面試當中也往往會問到關於 Vue 方面的各種問題,其中大部分面試官會問到如上這種問題。最近一直在做 Vue項目代碼層面上的優化,說實話,優化別人的代碼真是件痛苦的事情,功能實現尚且不說,就說代碼規範我就能再寫出一篇文章來。
  • Vue.js最佳實踐(五招讓你成為Vue.js大師)
    如果有人需要Vue.js入門系列的文章可以在評論區告訴我,有空就給你們寫。對大部分人來說,掌握Vue.js基本的幾個API後就已經能夠正常地開發前端網站。但如果你想更加高效地使用Vue來開發,成為Vue.js大師,那下面我要傳授的這五招你一定得認真學習一下了。
  • 重學鞏固你的Vuejs知識體系(下)
    destroyed類型為function,詳細:vue實例銷毀後調用,調用後,vue實例指示的所有東西都會解綁定,所有的事件監聽器會被移除,所有的子實例也會被銷毀。該鉤子在伺服器端渲染期間不被調用。vue面試題談一談你對mvvm的理解雙向綁定的過程視圖view,路由-控制器Controller,數據Modelview->dom,viewModel,Model數據
  • Vue.js——60分鐘組件快速入門(上篇)
    #app是Vue實例掛載的元素,應該在掛載元素範圍內使用組件-->            <my-component></my-component>        </div>    </body>    <script src="js/vue.js"></script>
  • 【Vue.js入門到實戰教程】11-Vue Loader(下)| 編寫一個單文件 Vue 組件
    然後在 src/main.js 中引入 Bootstrap 的腳本和樣式文件:import Vue from 'vue'import App from '.編寫 ModalExample 組件我們將 vue_learning/component/slot.html 中的 modal-example 組件拆分出來,在 vue_learning/demo-project/src/components 目錄下新建一個單文件組件 ModalExample.vue,將 modal-example 組件代碼按照 Vue Loader 指定的格式填充到對應位置
  • 學點vue.js的東西,什麼都得學點,面試時說不定對方會問什麼
    說vue呢也是關注視圖層的框架,它嫌react太繞了,redux太麻煩了,然後就說自己很簡單,說自己還有雙向綁定,好的很,不是小好
  • 揭密vue.js的神秘之處,小程序跟vue有什麼關係
    微容用的微信小程序平臺採用開發思路是前後端分離,前端採用vue.js+h5+jq開發,後端採用MVE的思路,用php開發,用vue.js構建來微信小程序可視化前端之後,微容給大家介紹下vue的來源和特徵。
  • Vue.js:60分鐘組件快速入門(上篇)
    #app是Vue實例掛載的元素,應該在掛載元素範圍內使用組件-->            <my-component></my-component>        </div>    </body>    <script src="js/vue.js"></script>
  • 教你如何以Vue.js插件的形式實現消息提示框
    在Vue-CLI 3腳手架項目中的src目錄下新建plugin文件夾,在該文件夾下新建MessageBox.vue,代碼如例1-1所示。}}按照上述插件開發形式編寫消息提示框插件,在plugin目錄下新建vue-msgbox.js,完整的代碼如例1-2所示。