久久精品中文字幕免费_91香蕉国产亚洲一区二区三区_国产精品巨作无遮拦_亚洲人成电影

    <center id="oy65s"><ol id="oy65s"></ol></center>

  • <menu id="oy65s"></menu>
    當前位置:首頁 > 足球資訊 > 正文內容

    從源碼中學Vue(三)深入理解計算屬性computed原理

    杏彩體育2年前 (2023-01-28)足球資訊98

    歡迎來到我的《從源碼中學Vue》專題系列文章,更多精彩內容持續(xù)更新中,歡迎關注 :)

    上一章節(jié)我們通過源碼分析了Vue中的methods對象下的方法是如何掛載到vm下,以及各方法內部的this為何是指向了vm對象。

    其實在Vue中,還有一個特別有用的API,那就是computed計算屬性,那么我們接下來就通過源碼看看它內部做了什么吧!

    本章目標

    computed運行效果computed源碼中做了什么?

    欲分析源碼,我們首先要搞清楚在Vue中,computed是如何工作的。

    請看示例:

    大概說下computed計算屬性的用法,它本身是一個對象,對應的key值都將會被Object.defineProperty給兼聽到,也可以將對應的key直接像data中的數(shù)據(jù)一樣綁定到我們的模板字符串中去渲染。

    接下來我們去看下里面的源碼吧。

    首先還是找到對應的文件:node_modules\vue\src\core\iinstance\state.js

    和之前說到的methods源碼一樣,它有一個initComputed方法,核心源碼就在這個方法中,走,進去看看。

    在第175行中,源碼開始使用for in去遍歷對象,接下來我們看下這段源碼

    首先,我們通過const userDef = computed[key]獲取到computed對象的中的value值,這個值的類型可以是function,也可以是對象,但是如果是對象的話,那么這個對象下一定要實現(xiàn)一個ge對象,否則會報Getter is missing for computed property

    也就是說,我們還可以這樣寫

    我們將total寫成一個對象,然后實現(xiàn)一個get方法

    繼續(xù)往下看

    const isSSR = isServerRendering()

    這段表示是否是SSR(服務器渲染),一般來說,我們的項目都是非服務器渲染的。所以這個isSSR返回一個false.

    緊接著,如果是非SSR下,我們則給每一個computed屬性生成一個Watch實例,用于檢測computed的變化。

    這里我們著重來看下這個參數(shù):computedWatcherOptions,源碼在前面是這樣定義的。

    lazy:true,這一點在后面會非常有用

    wather等我們后面涉及到兼聽的時候再去看源碼。

    再拄后是這樣的:

    判斷我們在computed中的key值是否在我們的data或者props中定義過,如果定義了,則拋出異常,沒有定義那就是開始調用defineComputed(vm, key, userDef)函數(shù)。

    到這里,核心函數(shù)來啦,我們去看下defineComputed(vm, key, userDef)函數(shù)的實現(xiàn)吧。

    先來看我圈出來的兩行代碼,源碼通過Object.defineProperty(target, key, sharedPropertyDefinition)來檢測vm對象的comouted中的key的變化。

    再來看

    const shouldCache = !isServerRendering()

    非服務器渲染環(huán)境下,需要緩存,這里就開始引出了,computed的特點來了,緩存

    從源碼看,如果是需要緩存的話,還調用了createComputedGetter方法,接下來我們去找這個方法的定義。

    源碼根據(jù)compued對象下的key值找到對應的watcher對象,然后判斷對象是否dirty

    如果dirty了,那就是調用watcher.evaluate()方法

    接下來有必要去翻翻watch類中具體實現(xiàn)了。

    找到watcher.js

    我先看到了這個dirty屬性。

    可以看出來,這個dirty是和我們傳入的lazy相關,前面我們說到在實現(xiàn)化watcher的時候,默認傳入了{lazy:true}

    所以第一次我們會調用 wather.evaluate()方法,我們再來看下evaluate方法的實現(xiàn)。

    當dirty為true的時候,我們將get到的值賦給了this.也就是我們的wather對象的value屬性上,并且將我們的dirty設置為false,

    也就是說在調用 createComputedGetter 函數(shù)的時候,當我們的watcher對象的dirty屬性為false的時候,就直接返回watcher對象的value屬性值。

    dirty英文意思為臟的。也步是當數(shù)據(jù)有變化的時候,我們的computed屬性對就去做相應的get調用,否則直接返回wather實例上的value屬性

    PS:了解angular1.x的童鞋可能知道,它里面的雙向數(shù)據(jù)綁定原理就是臟值檢查(dirtycheck)

    總結:

    computed中的key不能與data,props,methods中的key相同。在computed下的value值可以是一個函數(shù),也可以是一個對象,為對象的時候,必須得實現(xiàn)一個get對象(一般為方法)computed中的屬性可以直接綁定到模板字符串中。一般來說涉及到兩個data中的數(shù)據(jù)的相互計算的時候,我們使用計算屬性會比較合理。源碼中直接給computed對象中的key進行了數(shù)據(jù)綁定。

    這里是暢哥聊技術 《從源碼中學Vue》系列文章,更多精彩內容持續(xù)更新中,敬請期待。

    未完待續(xù)。。。

    掃描二維碼推送至手機訪問。

    版權聲明:本文由財神資訊-領先的體育資訊互動媒體轉載發(fā)布,如需刪除請聯(lián)系。

    本文鏈接:http://www.daniuzhishi.com/?id=44546

    分享給朋友:

    “從源碼中學Vue(三)深入理解計算屬性computed原理” 的相關文章

    世界杯足球彩票是怎么玩的

    世界杯足球彩票是怎么玩的

    世界杯足球彩票如果彩民想要參與到這種彩票的購買中,可以到當?shù)氐捏w彩中心中購買,每一個彩民都可以對每一個隊伍的勝負或者進球數(shù)進行選號的操作,有著單場勝負和精選二串一,全場比分,總進球等多種不同的選號方式。 在每一次的世界杯中,都有著不同實力水平的隊伍,會參與到這項比賽活動中...

    足彩彩票怎么看?

    足彩彩票怎么看?

    對于我來說,足球已經成為我生活中不可缺少的一部分,在足彩領域奮斗數(shù)年之久,剛剛接觸足彩時,并不像如今的環(huán)境(商業(yè)足球)這樣困難,當時的足彩相對來說是很簡單的,但是時代在進步,社會在發(fā)展,足彩也在一步步的改變?,F(xiàn)在,大部分接觸足彩的朋友,都是抱著盈利的追求,希望通過...

    美國國足在世界杯的實力如何?世界足球排名16

    美國國足在世界杯的實力如何?世界足球排名16

    不是說全球前二的經濟體都不踢世界杯嗎?那么為啥美國會出現(xiàn)在這一次世界杯? 不查還好,一查嚇一大跳,我翻了一下美國世界杯的記錄,人家自90年開始,就開始一屆不差的進入世界杯。而且人家現(xiàn)在世界足球排名第16,而我們的排名則是沒眼看了 當然美國那邊競爭對手實力...

    意甲聯(lián)賽國際米蘭迎接開門紅,足球比分4-0盧卡庫收獲處子之球

    意甲聯(lián)賽國際米蘭迎接開門紅,足球比分4-0盧卡庫收獲處子之球

    北京時間8月27日凌晨,2019-2020賽季意甲聯(lián)賽第1輪的一場焦點戰(zhàn)在米蘭城梅阿查球場展開角逐,由國際米蘭主場迎戰(zhàn)升班馬萊切。盧卡庫在本次比賽中收獲意甲處子球,最終,國際米蘭4-0橫掃萊切,拿到了新賽季開門紅...

    體彩·競彩世界杯戰(zhàn)報|波蘭2:0完勝沙特 萊萬攻入個人世界杯首球

    體彩·競彩世界杯戰(zhàn)報|波蘭2:0完勝沙特 萊萬攻入個人世界杯首球

      北京時間11月26日21:00,世界杯小組賽C組第2輪,波蘭迎戰(zhàn)沙特阿拉伯。上半場萊萬助攻澤林斯基破門,下半場萊萬攻入個人世界杯的首粒進球。最終,波蘭2:0完勝沙特。   第6分鐘,卡什右路得球送出傳中,這球直奔球門而去,阿洛瓦伊斯高高躍起將球摘下。第13分鐘,穆罕默...

    場地尺寸——5人制標準足球場地介紹

    場地尺寸——5人制標準足球場地介紹

    足球是一種球類運動,它也指足球比賽中的用球,但在這里它代表前者。古代足球起源于中國,現(xiàn)代足球起源于英國,被認為是世界第一運動,是全球體育界最具影響力的單項體育運動。五人制足球(Futsal)是足球的一個變種。名字取自葡萄牙語futebol de sal?o及西班牙語fú...

    ?