解釋Vue深入響應式原理
tip:例項建立之後新增新的屬性到例項上,不會觸發檢視更新
分解tip:new Vue() 生命週期created() 之後 在data內新增的屬性,不會觸發view層的更新
new Vue({{
el: '#app',
data: {
user: {
name: 'tom',
sex: 'male'
}
},
created() {
this.user.msg = 'reactivity' // 成功建立並在檢視更新
},
mounted() {
this.user.data = 'reactivity' // 成功建立,但不更新檢視
}
})
解決方法
1Vue API
vm.$set(obj, key, value)
2Object.assign()
Object.assign({}, this.user, {key: value})
new Vue({{
el: '#app',
data: {
user: {
name: 'tom',
sex: 'male'
}
},
created() {
this.user.msg = 'reactivity' // 成功建立並在檢視更新
},
mounted() {
this.$set(this.user, 'data', 'reactivity') // Vue API
Object.assign({}, this.user, {'data', 'reactivity'}) // Object.assign
}
})
非同步資料操作
非同步獲取資料後更新檢視:
new Vue({{
el: '#app',
data: {
user: {
name: 'tom',
sex: 'male'
}
},
created() {
setTimeout(() => {
// this.user.msg = 'reactivity' // 不更新檢視
this.$set(this.user, 'data', 'reactivity') // Vue API
Object.assign({}, this.user, {'data', 'reactivity'}) // Object.assign
}, 1000) // 模擬非同步資料
},
mounted() {
}
})
原理:非同步資料操作的棧佇列在整個vue生命週期最後
非同步更新佇列
this.$nextTick() 下一次棧佇列執行完畢之後
非同步資料更新後,操作對應的dom更新
new Vue({{
el: '#app',
data: {
user: {
name: 'tom',
sex: 'male'
}
},
created() {
setTimeout(() => {
this.user = {'age': 18}
this.$nextTick(() => {
// 資料重新整理後對應的dom更新完畢
})
}, 1000) // 模擬非同步資料
},
mounted() {
}
})
MutationObserver
vue2.0使用MutationObserver API作為非同步更新佇列的DOM更新解決方案
MutationObserver屬於microtasks,執行效率更高,優先於macrotasks - setTimeout執行
// Firefox和Chrome早期版本中帶有字首
const MutationObserver = window.MutationObserver
|| window.WebKitMutationObserver || window.MozMutationObserver
// 建立觀察者物件
const observer = new MutationObserver(mutations=>{
mutations.forEach(function(mutation) {
console.log(mutation.type);
})
})
// 配置觀察選項:
const config = {
attributes: true,
childList: true,
characterData: true
}
// 選擇目標節點
const target = document.querySelector('#test');
// 傳入目標節點和觀察選項
observer.observe(target, config);
target.appendChild(document.createElement("div"))
/*
* mutationObserver優先於setTimeout
*/
setTimeout(console.log,0,'setTimeout')
console.log('appending')
target.setAttribute('class','hello') //新增了一個元素子節點,觸發回撥函式.
// 隨後,你還可以停止觀察
// observer.disconnect();
/*
* doc https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
*/
執行結果
/*
appending
childList
attributes
setTimeout
*/
相關文章
- 深入解析vue響應式原理Vue
- 深入瞭解 Vue 響應式原理(資料攔截)Vue
- 深入淺出Vue響應式原理(完整版)Vue
- Vue 響應式原理Vue
- Vue響應式—-資料響應式原理Vue
- 自己實現一個VUE響應式--VUE響應式原理Vue
- Vue 原始碼解讀(3)—— 響應式原理Vue原始碼
- Vue 資料響應式原理Vue
- 學習Vue響應式原理Vue
- vue2響應式原理Vue
- Vue 響應式實現原理Vue
- 完美解釋 Javascript 響應式程式設計原理JavaScript程式設計
- vue響應式原理學習(一)Vue
- Vue 原始碼(一):響應式原理Vue原始碼
- Vue2.x響應式原理Vue
- 探索 Vue.js 響應式原理Vue.js
- 【2019 前端進階之路】深入 Vue 響應式原理,從原始碼分析前端Vue原始碼
- 瞭解釋出訂閱模式之後,vue響應式原理竟如此簡單!模式Vue
- Vue 3 響應式原理及實現Vue
- Vue3.0資料響應式原理Vue
- Vue響應式原理-理解Observer、Dep、WatcherVueServer
- 理解Vue 3響應式系統原理Vue
- 由淺入深,帶你用JavaScript實現響應式原理(Vue2、Vue3響應式原理)JavaScriptVue
- Vue響應式原理與模擬實現Vue
- 從原始碼看Vue的響應式原理原始碼Vue
- Vue.js的響應式系統原理Vue.js
- vue的響應式原理:依賴追蹤Vue
- 【Vue3響應式原理#02】Proxy and ReflectVue
- 【vue】用圖告訴你響應式原理Vue
- 【2019 前端進階之路】深入 Vue 響應式原理,活捉一個 MVVM(超詳細!)前端VueMVVM
- 【Vue原始碼學習】響應式原理探祕Vue原始碼
- vue2.0與3.0響應式原理機制Vue
- vue基礎-動態樣式&表單繫結&vue響應式原理Vue
- vue.js響應式原理解析與實現Vue.js
- vue響應式原理學習(二)— Observer的實現VueServer
- vue響應式資料的實現原理解析Vue
- 【原始碼系列#02】Vue3響應式原理(Effect)原始碼Vue
- 【原始碼系列#01】vue3響應式原理(Proxy)原始碼Vue
- 【原始碼系列#05】Vue3響應式原理(Ref)原始碼Vue