<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在vue中狀態更新是非同步的,這一點和react中的setstate類似。
非元件解決方案:
<div id="example">{{message}}</div>
var vm = new Vue({ el: '#example', data: { message: '123' } }) vm.message = 'new message' // 更改資料 vm.$el.textContent === 'new message' // false Vue.nextTick(function () { vm.$el.textContent === 'new message' // true })
在元件內使用 vm.$nextTick() 實體方法特別方便,因為它不需要全域性 Vue ,並且回撥函數中的 this 將自動繫結到當前的 Vue 範例上:
Vue.component('example', { template: '<span>{{ message }}</span>', data: function () { return { message: '沒有更新' } }, methods: { updateMessage: function () { this.message = '更新完成' console.log(this.$el.textContent) // => '沒有更新' this.$nextTick(function () { console.log(this.$el.textContent) // => '更新完成' }) } } })
因為 $nextTick() 返回一個 Promise 物件,所以你可以使用新的 ES2016 async/await 語法完成相同的事情:methods: {
updateMessage: async function () { this.message = 'updated' console.log(this.$el.textContent) // => '未更新' await this.$nextTick() console.log(this.$el.textContent) // => '已更新' } }
vue為了避免頻繁的操作DOM,採用非同步的方式更新DOM。這些非同步操作會通過nextTick函數將這些操作以cb的形式放到任務佇列中(以微任務優先),當每次tick結束之後就會去執行這些cb,更新DOM。
非同步更新內部是最重要的就是nextTick方法,它負責將非同步任務加入佇列和執行非同步任務。VUE 也將它暴露出來提供給使用者使用。在資料修改完成後,立即獲取相關DOM還沒那麼快更新,使用nextTick便可以解決這一問題。
在下次DOM更新迴圈結束之後執行的延遲迴撥。在修改資料之後立即使用該方法,獲取更新後的DOM。
/*存放非同步執行的回撥*/ const callbacks = [] /*一個標記位,如果已經有timerFunc被推播到任務佇列中去則不需要重複推播*/ let pending = false /*一個函數指標,指向函數將被推播到任務佇列中,等到主執行緒任務執行完時,任務佇列中的timerFunc被呼叫*/ let timerFunc /* 推播到佇列中下一個tick時執行 cb 回撥函數 ctx 上下文 */ export function nextTick (cb?: Function, ctx?: Object) { let _resolve // 第一步 傳入的cb會被push進callbacks中存放起來 callbacks.push(() => { if (cb) { try { cb.call(ctx) } catch (e) { handleError(e, ctx, 'nextTick') } } else if (_resolve) { _resolve(ctx) } }) // 檢查上一個非同步任務佇列(即名為callbacks的任務陣列)是否派發和執行完畢了。pending此處相當於一個鎖 if (!pending) { // 若上一個非同步任務佇列已經執行完畢,則將pending設定為true(把鎖鎖上) pending = true // 呼叫判斷Promise,MutationObserver,setTimeout的優先順序 timerFunc() } // 第三步執行返回的狀態 if (!cb && typeof Promise !== 'undefined') { return new Promise(resolve => { _resolve = resolve }) } }
Vue 在更新 DOM 時是非同步執行的。只要偵聽到資料變化,Vue 將開啟一個佇列,並緩衝在同一事件迴圈中發生的所有資料變更。
如果同一個 watcher 被多次觸發,只會被推入到佇列中一次。這種在緩衝時去除重複資料對於避免不必要的計算和 DOM 操作是非常重要的。
然後,在下一個的事件迴圈“tick”中,Vue 重新整理佇列並執行實際 (已去重的) 工作。
Vue 在內部對非同步佇列嘗試使用原生的 Promise.then、MutationObserver 和 setImmediate,如果執行環境不支援,則會採用 setTimeout(fn, 0) 代替。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45