vue實(shí)現(xiàn)數(shù)據(jù)控制視圖的原理解析
這篇主要講的就是vue很重要的一塊知識(shí)點(diǎn),雙向數(shù)據(jù)綁定是如何實(shí)現(xiàn)的。一開(kāi)始看這一塊的內(nèi)容的時(shí)候比較迷茫,迷茫在以下幾個(gè)點(diǎn):
- 這塊內(nèi)容該從哪邊入手
- 數(shù)據(jù)變化是如何驅(qū)動(dòng)視圖層更新的
- 做題深化知識(shí)點(diǎn)
從哪邊著手去看響應(yīng)式原理
我這邊提供三個(gè)方向,從這三個(gè)方向,你都可以看到watcher的使用,然后watcher的使用過(guò)程中,會(huì)摻雜到observer以及dep,然后以點(diǎn)帶面,對(duì)整體進(jìn)行梳理
初始化的render流程去看
在lifecycle這個(gè)文件中的mountComponent這個(gè)方法里,創(chuàng)建了一個(gè)watcher。代碼如下:
new Watcher(vm, updateComponent, noop, { before () { if (vm._isMounted && !vm._isDestroyed) { callHook(vm, 'beforeUpdate') } } }, true /* isRenderWatcher */)
可以透過(guò)這個(gè)傳參,梳理出整一個(gè)
- 從watch的角度去看
- 從computed的角度去看
數(shù)據(jù)變化是如何驅(qū)動(dòng)視圖層更新的
這個(gè)問(wèn)題其實(shí)可以分兩個(gè)方面去看:
如何知道數(shù)據(jù)變化了
如何知道某一塊視圖和數(shù)據(jù)有關(guān),并更新他 如何知道數(shù)據(jù)變化了
答案:數(shù)據(jù)劫持
數(shù)據(jù)劫持的兩種方式
Object.defineProperty proxy
Vue3.0中的數(shù)據(jù)劫持是用proxy來(lái)實(shí)現(xiàn)的,目前閱讀的源碼中,都是以 Object.defineProperty
這種方式來(lái)實(shí)現(xiàn)的。
如何知道某一塊視圖和數(shù)據(jù)有關(guān),并更新他
答案:依賴收集以及訂閱更新
詳細(xì)解讀過(guò)程:用圖告訴你響應(yīng)式原理
這里僅用一個(gè)簡(jiǎn)單的例子和圖,來(lái)明確一下整個(gè)流程
<div id="app"> {{ message }} {{ message1 }} <input type="text" v-model="message"> <div @click="changeMessage">改變message</div> </div>
var app = new Vue({ el: '#app', data: { message: '1', message1: '2', }, methods: { changeMessage() { this.message = '2' } }, watch: { message: function(val) { this.message1 = val } } })
依賴收集流程圖
依賴收集的最終結(jié)果:
訂閱更新流程圖:
。
做題深化知識(shí)點(diǎn)
題目如下:
1、簡(jiǎn)述Vue的響應(yīng)式原理
2、計(jì)算屬性和watch的區(qū)別
3、Vue中給data中的對(duì)象屬性添加一個(gè)新的屬性時(shí)會(huì)發(fā)生什么,如何解決?
對(duì)于第一和第二在這里就不花篇幅去說(shuō)明。
Vue中給data中的對(duì)象屬性添加一個(gè)新的屬性時(shí)會(huì)發(fā)生什么,如何解決?
我們?cè)谧鰳I(yè)務(wù)的時(shí)候經(jīng)常會(huì)遇到這樣的情況,我舉一個(gè)簡(jiǎn)單的例子:
<template> <div> <ul> <li v-for="value in obj" :key="value"> {{value}} </li> </ul> <button @click="addObjB">添加obj.b</button> </div> </template> <script> export default { data () { return { obj: { a: 'obj.a' } } }, methods: { addObjB () { this.obj.b = 'obj.b' console.log(this.obj) } } } </script> <style></style>
依賴收集流程:
從中我們可以發(fā)現(xiàn),renderWatch是有收集 Dep(obj)
和 Dep(Obj.a)
的,但是當(dāng)我們改變Obj的時(shí)候,并沒(méi)有觸發(fā)視圖的更新。因?yàn)槲覀冊(cè)诟淖僶bj的值的時(shí)候,并沒(méi)有去觸發(fā)Dep(obj)。
產(chǎn)生問(wèn)題的本質(zhì)原因:
1、vue會(huì)在state.js文件的initData的方法中,將data屬性中的每一個(gè)key都變成響應(yīng)式屬性。
2、視圖在渲染過(guò)程中,會(huì)將renderWatcher收集到用到的值的dep中,方便依賴更新(不懂的在回過(guò)去看一下依賴收集流程)
3、當(dāng)你額外添加一個(gè)屬性的時(shí)候,該屬性并不是響應(yīng)式屬性。
那如何去改變:
addObjB () { // this.obj.b = 'obj.b' this.$set(this.obj, 'b', 'obj.b') console.log(this.obj) }
總結(jié)
這篇文章是年度總結(jié)的開(kāi)篇,后續(xù)會(huì)繼續(xù)總結(jié)初始化部分、render部分和patch部分。希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
上一篇:Node.js創(chuàng)建一個(gè)Express服務(wù)的方法詳解
欄 目:JavaScript
下一篇:Vue前端項(xiàng)目部署IIS的實(shí)現(xiàn)
本文標(biāo)題:vue實(shí)現(xiàn)數(shù)據(jù)控制視圖的原理解析
本文地址:http://mengdiqiu.com.cn/a1/JavaScript/9286.html
您可能感興趣的文章
- 04-02java后端代碼分頁(yè) java后端實(shí)現(xiàn)分頁(yè)page
- 01-10Echarts實(shí)現(xiàn)單條折線可拖拽效果
- 01-10在Vue項(xiàng)目中使用Typescript的實(shí)現(xiàn)
- 01-10js實(shí)現(xiàn)上傳圖片并顯示圖片名稱
- 01-10Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡(jiǎn)單方法
- 01-10echarts實(shí)現(xiàn)折線圖的拖拽效果
- 01-10js數(shù)據(jù)類型轉(zhuǎn)換與流程控制操作實(shí)例分析
- 01-10d3.js實(shí)現(xiàn)圖形縮放平移
- 01-10小程序簡(jiǎn)單兩欄瀑布流效果的實(shí)現(xiàn)
- 01-10H5實(shí)現(xiàn)手機(jī)拍照和選擇上傳功能


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02javascript點(diǎn)線,點(diǎn)線的代碼
- 04-02javascript潛力,javascript強(qiáng)大嗎
- 04-02javascript替換字符串,js字符串的替換
- 04-02javascript移出,js 移入移出
- 04-02包含javascript舍的詞條
- 04-02javascript并行,深入理解并行編程 豆瓣
- 04-02javascript匿名,js匿名方法
- 04-02javascript警報(bào),JavaScript警告
- 04-02javascript遮蓋,JavaScript遮蓋PC端頁(yè)面
- 04-02javascript前身,javascript的前身
隨機(jī)閱讀
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)