了解vue3.0的異步更新原理

2020-12-15 mySoulCode

「關注 前端開發社區 ,回復「 1」 即可加入 前端技術交流群,回復 「 2」 即可免費領取500G前端乾貨!

今天我們簡單了解下vue3.0的異步更新原理,了解一下effect,watchEffect的特點以及最主要queueFlush函數的實現(函數名字本意就是:排隊刷新)

effect特點

import { effect, reactive } from './reactivity';let state = reactive({ name: 'zf', age: 11 })effect(() => { console.log(state.name);})state.name = 'zf';state.name = 'jw';state.name = 'jg';每次更新狀態,都會重新運行effect。如果要是effect中包含渲染邏輯,可能會導致多次更新視圖。

watchEffect

import { effect } from "./reactivity";exportfunction watchEffect(effect, options) {return doWatch(effect, null, options);}let postFlushCbs = [];function queuePostFlushCb(cb){ postFlushCbs(cb); // 將effect放到數組中進行刷新 queueFlush();}function doWatch(source, cb, options) { // 做watchlet getter;if (isFunction(source)) { getter = () => source(); }let scheduler = (job) => queuePostFlushCb(job); const runner = effect(getter,{ // 創建一個effect lazy:true, computed: true, scheduler // 自定義scheduler }) runner();}watchEffect也是effect,只是自定義了scheduler函數

queueFlush實現

let isFlushPending = false; // 是否正在等待刷新let isFlushing = false; // 是否正在刷新const p = Promise.resolve();function nextTick(fn) {return fn ? p.then(fn) : p}functionflushPostFlushCbs(){if(postFlushCbs.length){ // 隊列有值進行隊列刷新 const cbs = [...new Set(postFlushCbs)]; postFlushCbs.length = 0;for(let i = 0; i < cbs.length;i++){ cbs[i](); } }}functionflushJobs() { isFlushPending = false; // 開始執行任務 isFlushing = true; // 正在刷新 flushPostFlushCbs(); // 刷新隊列 isFlushing = false; // 刷新完畢}functionqueueFlush() {if (!isFlushPending && !isFlushing) { isFlushPending = true; nextTick(flushJobs); // 稍後刷新任務隊列 }}nextTick本質原理就是個promise(微任務),這裡會將effect 暫存起來並進行去重之後執行。

相關焦點

  • Vue的異步更新實現原理
    講道理,如果不在vue裡,單獨運行這段程序的話,輸出一定是從1到100,但是為什麼在vue中就不一樣了呢?for(let i=1; i<=100; i++){console.log(i);}複製代碼這就涉及到Vue底層的異步更新原理,也要說一說nextTick的實現。不過在說nextTick之前,有必要先介紹一下JS的事件運行機制。
  • Vue異步更新機制和nextTick原理
    vue核心  實現之一,在整體流程中預先著手觀看者更新的調度者這一角色。大部分觀察者更新都會通過它的處理,在適當時機讓更新有序的執行。而nextTick作為替代更新的核心,也是需要學習的重點。js運行機制在理解初步更新前,需要對js運行機制進行了解,如果你已經知道這些知識,可以選擇跳過這部分內容。js執行是單線程的,它是基於事件循環的。
  • Vue面試必問,異步更新機制和nextTick原理
    目標Vue版本:2.5.17-beta.0vue源碼注釋:https://github.com/SHERlocked93/vue-analysis聲明:文章中源碼的語法都使用 Flow,並且源碼根據需要都有刪節(為了不被迷糊 @_@),如果要看完整版的請進入上面的
  • Vue 進階面試必問,異步更新機制和 nextTick 原理
    目標Vue版本:2.5.17-beta.0vue源碼注釋:https://github.com/SHERlocked93/vue-analysis聲明:文章中源碼的語法都使用 Flow,並且源碼根據需要都有刪節(為了不被迷糊 @_@),如果要看完整版的請進入上面的
  • Vue3.0新特性
    全局API的修改和優化更多的誓言性特性更好的Typescript 支持vue3.0源碼就是ts寫的為什麼要有vue3.0?指向上下文,主要是沒考慮的ts的集成ts+ vue Cli 項目搭建環境選擇多項選擇可以更好的支持ts之後選擇版本3.0就行安裝好用的vscode插件eslint 語法檢查1.vue3.0新特性介紹1.1 ref的妙用
  • Vue面試題(3)Vue-Router和Vuex
    2、action 和 mutation 區別mutation 是同步更新數據(內部會進行是否為異步方式更新數據的檢測)內部並不能檢測到是否異步更新,而是實例上有一個開關變量 _committing,只有在 mutation 執行之前才會把開關打開,允許修改 state 上的屬性。並且在 mutation 同步執行完成後立刻關閉。
  • 全面解析Vue.nextTick實現原理
    大體掃了一眼,似乎可以得到實錘了:哦!vue是用MutationObserver監聽DOM更新完畢的!難道不感覺哪裡不對勁嗎?讓我們細細想一下:我們要監聽的是模板中的DOM更新完畢,vue為什麼自己創建了一個文本節點來監聽,這有點說不通啊!難道自己創建的文本節點更新完畢,就能代表其他DOM節點更新完畢嗎?這又是什麼道理!
  • vue-antd-admin 0.7.1 已經發布
    vue-antd-admin 0.7.1 已經發布。
  • 【Vuejs】778- 超全 Vuejs 知識點(基礎到進階)
    層並自動將數據渲染到頁面中,視圖變化的時候會通知viewModel層更新數據了解mvc/mvp/mvvm的區別Vue2.x響應式數據/雙向綁定原理Vue 數據雙向綁定主要是指:數據變化更新視圖,視圖變化更新數據。
  • 基於 Laravel + Vue 組件實現文件異步上傳
    ://laravel.com/docs/csrf#csrf-x-csrf-token');}意思是從當前頁面 meta 元標籤中獲取 [name="csrf-token"] 的值並將其設置到 axios 的請求頭欄位 X-CSRF-TOKEN 中,每次發送 POST 請求時會自動帶上它,這樣經過 CSRF 保護中間件時校驗該請求頭欄位通過則認為是安全請求放行(具體原理不了解的話可以看
  • vue基本知識點總結——面試必備
    3、vue中的模板編譯原理答:模板指的就是template。如果我們傳了一個template,我們會把template轉換成一個render函數,然後通過render函數返回虛擬DOM,再把虛擬的DOM變成真正的DOM。4、 響應式數據的原理答:響應式就是當數據變化的時候,可以讓視圖也同步更新。
  • 化身面試官出 20+ Vue 面試題,超級乾貨
    下面呢我就根據你對 vue 的理解,接著談談:3.你剛剛說到了 MVVM,能詳細說說嗎?答案全稱:Model-View-ViewModel , Model 表示數據模型層。數組裡每一項可能是對象,那麼我就是會對數組的每一項進行觀測,(且只有數組裡的對象才能進行觀測,觀測過的也不會進行觀測)vue3:改用 proxy ,可直接監聽對象數組的變化。6.說說 Vue 的事件綁定原理吧?
  • Vue面試中,經常會被問到的面試題/Vue知識點整理
    切記不要以為背了面試題,就萬事大吉了,最好是理解背後的原理,這樣面試的時候才能侃侃而談。不然,稍微有水平的面試官一看就能看出,是否有真才實學還是剛好背中了這道面試題。(都是一些基礎的vue面試題,大神不用浪費時間往下看)一、對於MVVM的理解?MVVM 是 Model-View-ViewModel 的縮寫。
  • 2020大廠前端面試之vue專題
    會進行依賴收集(收集當前組件的watcher) 如果屬性發生變化會通知相關依賴進行更新操作。原理:理解:(宏任務和微任務) 異步方法原理:_c('div', _l((3), function (i) {return _c('span', [_v("hello")])}), 0) : _e()}*/ const VueTemplateCompiler = require('vue-template-compiler'); let r2 = VueTemplateCompiler.compile(`<div v-show
  • Vue 3 正式發布 - OSCHINA - 中文開源技術交流社區
    提升性能與 Vue 2 相比,Vue 3 在捆綁包體積(通過 tree-shaking 減小約 41% 大小)、初始渲染(速度提升約 55%)、更新(速度提升約 133%)和內存使用率(降低約 54%)等方面有了顯著的性能提升。
  • vue題
    1.什麼是vue生命周期?答:Vue 實例從創建到銷毀的過程,就是生命周期。從開始創建、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、銷毀等一系列過程,稱之為 Vue 的生命周期。2.vue生命周期的作用是什麼?答:它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。3.vue生命周期總共有幾個階段?
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    比如vue,通過數據的雙向綁定,極大了提高了開發效率。3. MVVM框架:VUE的介紹Vue就是基於MVVM模式實現的一套框架,在vue中:Model:指的是js中的數據,如對象,數組等等。3.如果我們構建一個大型的應用,在這一點上,我們可能需要將東西分割成為各自的組件和文件,vue有一個命令行工具,使快速初始化一個真實的工程變得非常簡單(vue init webpack my-project)。
  • 前端技術:React&Vue對比
    如果你想和其他JavaScript框架一起使用,可以在這個方法中調用setTimeout, setInterval或者發送AJAX請求等操作(防止異步操作阻塞UI)。componentWillReceiveProps 在組件接收到一個新的 prop (更新後)時被調用。這個方法在初始化render時不會被調用。
  • Element-UI 死而復生,基於Vue3.0的版本來了
    element ui 2 github另外我們看到README.md下面的介紹:Element will stay with Vue 2.xFor Vue 3.0, we recommend using Element
  • vue高級進階系列——用typescript玩轉vue和vuex
    說的簡單點就是對vue的狀態進行統一管理,如下圖介紹了其管理模式:最簡單的使用方法長這樣的:// 如果在模塊化構建系統中,請確保在開頭調用了 Vue.use(Vuex)const store = new Vuex.Store({state: {count: 0},mutations: {increment