YouTube買粉丝、facebook刷点赞、tiktok买粉丝点赞–instagram买粉丝
YouTube買粉丝、facebook刷点赞、tiktok买粉丝点赞–instagram买粉丝

03 vue消息訂閱與發布(Vue雙向數據綁定原理分析 -- Dep(發布者,訂閱收集器))

来源: 发表时间:2024-05-19 03:20:08

在對數據的讀寫處理過程中,也就是 Object.defineProperty() 定義的數據 set、get 函數中。Vue 中對于的函數為 defineReactive,在精簡版實現中,我只保留了一些基本特性:

function defineReactive(obj, key, value) {

   var dep = new Dep()

   Object.defineProperty(obj, key, {

       enumerable: true,

       買粉絲nfigurable: true,

       get: function reactiveGetter() {

           if (Dep.target) {

               dep.depend()

           }

           return value

       },

       set: function reactiveSetter(newVal) {

           if (value === newVal) {

               return

           } else {

               value = newVal

               dep.notify()

           }

       }

   })

}

在對數據進行讀取時,如果當前有 Watcher(對數據的觀察者吧,watcher 會負責將獲取的新數據發送給視圖),那將該 Watcher 綁定到當前的數據上(dep.depend(),dep 關聯當前數據和所有的 watcher 的依賴關系),是一個檢查并記錄依賴的過程。而在對數據進行賦值時,如果數據發生改變,則通知所有的 watcher(借助 dep.notify())。這樣,即便是我們手動改變了數據,框架也能夠自動將數據同步到視圖。

Vue面試題集錦

原理:在創建Vue實例時,Vue會遍歷data選項的屬性,利用Object.defineProperty()為屬性添加getter和setter對數據的讀取進行劫持(getter用來依賴手機,setter用來派發更新),并且在內部追蹤依賴,在屬性被訪問和修改時通知變化。每個組件實例會有相應的watcher實例,會在組件渲染過程中記錄依賴的所有數據屬性,之后依賴項被改動時,setter方法會通知依賴與此data的watcher實例重新計算(派發更新),從而使它關聯的組件重新渲染。

一句話總結:vue.js采用數據劫持結合發布-訂閱模式,通過Object.defineProperty()來劫持各個屬性的setter、getter,在數據變動時發布消息給訂閱者,觸發響應的監聽回調。

我的理解:在new Vue的時候,在Observer中通過Object.defineProperty()達到數據劫持,代理所有數據的getter和setter屬性,在每次觸發setter的時候,都會通過Dep來通知Watcher,Watcher作為Observer數據監聽器與Compile模板解析器之間的橋梁,當Observer監聽到數據發生改變的時候,通過Updater來通知Compile更新視圖。而Compile通過Watcher訂閱對應數據,綁定更新函數,通過Dep來添加訂閱者,達到雙向綁定。

Vue實例從創建到銷毀的全過程,就是生命周期。也就是從開始創建、初始化數據、編譯模板、掛載DOM->渲染、更新->渲染、卸載等一系列過程。

它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。

它可以分為8個階段:創建前/后、載入前/后、更新前/后、銷毀前/后。

第一次頁面加載時會觸發beforeCreate、created、beforeMounted、mounted

DOM渲染在mounted中就已經完成。

1、beforeCreate:可以在這加個loading事件,在加載實例時觸發;

2、created:初始化完成時的事件寫在這里,如在這結束loading事件,異步請求也適宜在這里調用;

3、mounted:掛載元素,獲取DOM節點;

4、updated:如果對數據統一處理,在這里寫上相應函數;

5、beforeDestroy:可以放一個確認停止事件的確認框;

6、nextTick:更新數據后立即操作DOM。

1、對象方法v-bind:class="{ 'orange': isRipe, 'green': isNotRipe}"

2、數組方法v-bind:class="[class1, class2]"

3、行內v-bind:style="{ 買粉絲lor: 買粉絲lor, fontSize: fontSize+'px'}"

1、router-link標簽會渲染為標簽,咋填template中的跳轉都是這種;

2、另一種是編輯式導航,也就是通過js跳轉比如router.push('/home')

M- model ,model 表示數據模型,也可以在model中定義數據修改和操作的業務邏輯

V- view,view表示視圖,它負責將數據模型轉換為視圖展示出來

VM- viewmodel,viewmodel是一個同步view和model的對象,連接view和model,用于監聽數據模型的改變和控制視圖行為

買粉絲puted:買粉絲puted是計算屬性,也就是計算值,更多用于計算值的場景。它具有緩存性,買粉絲puted的值在getter執行后是會緩存的,只有在它依賴的屬性值改變之后,下一次獲取買粉絲puted的值時重新調用對應的getter來計算。

在style標簽上添加s買粉絲ped屬性,以表示它的樣式作用于當下的模塊,很好的實現了樣式私有化的目的,但是也得慎用,樣式不易改變。

解決方法:

① 使用混合型的css樣式,混合使用全局樣式和私有樣式。

② 深度作用選擇器:如果你希望s買粉絲ped樣式中的一個選擇器能夠作用的更深,可以使用>>>操作符。如:<style s買粉絲ped>.a>>>.b{ / ... /}</style>

一個元素綁定多個事件的寫法有兩種:

1、修飾符的使用

2、在method方法里分別寫兩個事件

Vue組件中的data值不能為對象,因為對象是引用類型,組件可能會被多個實例同時引用,如果data值為對象,將導致多個實例共享一個對象,其中一個組件改變data屬性值,其它實例也會受到影響。

原理:JS執行是單線程的,它是基于事件循環的。所有同步任務都在主線程上執行,形成一個執行棧。主線程之外,還存在一個任務隊列,只要異步任務有了運行結果,就在任務隊列中放置一個事件。一旦執行棧中的所有同步任務執行完畢,系統就會讀取任務隊列,看看那些對應的異步任務,等結束等待狀態,進入執行棧,開始執行。主線程不斷重復上面的步驟。主執行的執行過程就是tick,所有的異步結果都是通過任務隊列來調度的。任務分為兩大類:宏任務和微任務,宏任務包括:setTimeOut等,微任務包括promise.then。

Vue用異步隊列的方式來控制DOM更新和nextTick回調先后執行。在下次DOM更新循環結束之后執行延遲回調,nextTick主要使用了宏任務和微任務,nextTick把要執行的任務推入一個隊列中,在下一個tick同步執行隊列的所有任務,它是異步任務中的微任務。如果我們在更新了一個響應式數據后,需要同步拿到這個渲染后的DOM結果,就使用nextTick方法,異步拿這個結果。

使用方式:

① this. nextTick.then(cb); 異步

父組件調用子組件的方法

父組件: this.$refs.yeluosen.childMethod()

子組件向父組件傳值并調用方法: $emit

組件之間: bus==$emit+$on

1、第一種方法是直接在子組件中通過this. emit向父組件觸發一個事件,父組件監聽這個事件就行了。

3、第三種都可以實現子組件調用父組件的方法。

keep-alive是Vue內置的一個組件,可以使被包含的組件保留狀態,或避免重新渲染。

原來的組件實例會被復用。這也意味著組件的生命周期鉤子不會再被調用,你可以簡單的監控watch $route對象:

is用來動態切換組件,DOM模板解析

全局的:前置守衛、后置鉤子(beforeEach、afterEach)beforeResolve

單個路由獨享的:beforeEnter

組件級的:beforeRouteEnter(不能獲取組件實例this)、beforeRouteUpdate、beforeRouteLeave

這是因為在執行路有鉤子函數beforeRouteEnter的時候,組件還沒有被創建出來,先執行beforeRouteEnter,再執行周期鉤子函數beforeCreate,可以通過next獲取組件的實例

相关栏目: