日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

理解Vue深度响应原理

發布時間:2025/3/18 vue 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解Vue深度响应原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Vue核心原理之數據的深度響應

1.問題的引入

  • 為什么點擊下面的button界面會出現自增?

    <div id="example-2"> <simple-counter></simple-counter></div>Vue.component('simple-counter', { template: '<button v-on:click="counter += 1">{{ counter }} </button>', data: function () {return { counter: 0 } }}) new Vue({el: '#example-2'})
  • 為什么數據發生變化之后,視圖就發生變化?
  • 本文從三個方面來理解Vue處理深度響應的原理:
  • 數據定義
  • 數據綁定
  • 數據響應

2.數據的定義

  • 組件中定義數據{counter:0};
  • 初始化過程中,會執行observe(data, this);
  • 在observe()過程中會將data這個對象劫持,通過Object.defineProperty將data上所有的屬性綁定上getter和setter函數;(這是針對對象,對于數組,Vue通過改寫數組的原生方法來劫持);
  • 通俗的說就是只要誰獲取了counter的值就會觸發getter();要是誰改變了counter的值就會觸發setter();比如上述代碼中的button綁定{{count}}的時候一定會觸發getter();如果是count的值發生改變就一定會觸發setter()

3.數據綁定

  • 在頁面元素button中綁定{{count}};
  • 在編譯過程中,針對這個button會產生一個Watcher(vm, exp, cb(newValue,oldValue)),vm是Vue對象,exp是數據綁定的數據;cb()的邏輯是用來更新頁面。現在的問題是如何將數據的變化和Watcher關聯起來。
  • 在這里用到了一個重要的思想就是發布訂閱模式;Watcher初始化的時候會將Dep.target設置為this,也就是Watcher自己,同時會觸發count的getter方法,getter里面會調用Dep的depend方法,depend方法會調用Watcher的addDep方法,addDep方法就是將Watcher自己存放在Dep的事件池里面。

    class Dep {constructor() {this.id = uid++;this.subs = [];}addSub(sub) {this.subs.push(sub)}depend() {if (Dep.target) {Dep.target.addDep(this)}}removeSub(sub) {let ind = this.subs.findIndex(sub);this.subs.splice(ind, 1)}notify() {this.subs.forEach(sub => sub.update())} } Dep.target = null;

4.數據響應

  • 當發生點擊事件的時候,count的值改變,會觸發setter里面的方法,這個方法會調用dep.notify();它會告知Dep的事件池里的存放的Watcher去執行它的update()方法;Watcher的update()方法;這個方法里面會獲取count的新的值,給它的回調cb(),去更新視圖。
  • 這三個過程就是下面Vue官方給出的示意圖的含義。

總結

以上是生活随笔為你收集整理的理解Vue深度响应原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。