Vue 的 computed 和 watch 的區(qū)別

完整高頻題庫倉庫地址:https://github.com/hzfe/awesome-interview

完整高頻題庫閱讀地址:https://hzfe.github.io/awesome-interview/

相關(guān)問題

  • computed 和 watch 的實(shí)現(xiàn)原理
  • computed 和 watch 的適用場(chǎng)景

回答關(guān)鍵點(diǎn)

響應(yīng)變化 屬性 偵聽

computed 是模板表達(dá)式的聲明式描述,會(huì)創(chuàng)建新的響應(yīng)式數(shù)據(jù)啦撮。而 watch 是響應(yīng)式數(shù)據(jù)的自定義偵聽器,用于響應(yīng)數(shù)據(jù)的變化。除此之外,computed 還具有可緩存慕购,可依賴多個(gè)屬性邻邮,getter 函數(shù)無副作用等特點(diǎn)。watch 則更適用于異步或開銷大的操作鹊杖。

知識(shí)點(diǎn)深入

1. 實(shí)現(xiàn)原理

在了解 Vue 數(shù)據(jù)雙向綁定的基礎(chǔ)上,computed 等同于為屬性設(shè)置 getter 函數(shù)(也可設(shè)置 setter)扛芽,而 watch 等同于為屬性的 setter 設(shè)置回調(diào)函數(shù)骂蓖、監(jiān)聽深度 deep 及響應(yīng)速度 immediate。下面簡(jiǎn)單講解下兩者的實(shí)現(xiàn)原理川尖,具體細(xì)節(jié)可以參考源碼登下。

1.1 computed 原理

主要分為四個(gè)階段

  • 初始化:為 computed 屬性創(chuàng)建 lazy watcher(此處 watcher 指雙向綁定中的監(jiān)聽器,下同)叮喳。
  • 首次模板渲染:渲染 watcher 檢測(cè)到 computed 屬性時(shí)被芳,會(huì)調(diào)用 computed 屬性的 getter 方法,而 computed 屬性的 getter 方法會(huì)調(diào)用依賴屬性的 getter馍悟,從而形成鏈?zhǔn)秸{(diào)用畔濒,同時(shí)保存引用關(guān)系用于更新。取得計(jì)算結(jié)果后 lazy watcher 會(huì)將結(jié)果緩存锣咒,并返回給渲染 watcher 進(jìn)行模板渲染侵状。
  • 多次模板渲染:直接取 lazy watcher 中的緩存值給到渲染 watcher 進(jìn)行渲染。
  • 依賴屬性更新:根據(jù)首次模板渲染階段構(gòu)建的依賴關(guān)系向上通知 lazy watcher 進(jìn)行重新計(jì)算毅整,緩存計(jì)算結(jié)果并通知渲染 watcher 重新渲染更新頁面趣兄。

1.2 watch 原理

watch 本質(zhì)上是為每個(gè)監(jiān)聽屬性 setter 創(chuàng)建了一個(gè) watcher,當(dāng)被監(jiān)聽的屬性更新時(shí)悼嫉,調(diào)用傳入的回調(diào)函數(shù)诽俯。常見的配置選項(xiàng)有 deep 和 immediate,對(duì)應(yīng)原理如下:

  1. deep:深度監(jiān)聽對(duì)象承粤,為對(duì)象的每一個(gè)屬性創(chuàng)建一個(gè) watcher暴区,從而確保對(duì)象的每一個(gè)屬性更新時(shí)都會(huì)觸發(fā)傳入的回調(diào)函數(shù)。主要原因在于對(duì)象屬于引用類型辛臊,單個(gè)屬性的更新并不會(huì)觸發(fā)對(duì)象 setter仙粱,因此引入 deep 能夠很好地解決監(jiān)聽對(duì)象的問題。同時(shí)也會(huì)引入判斷機(jī)制彻舰,確保在多個(gè)屬性更新時(shí)回調(diào)函數(shù)僅觸發(fā)一次伐割,避免性能浪費(fèi)候味。
  2. immediate:在初始化時(shí)直接調(diào)用回調(diào)函數(shù),可以通過在 created 階段手動(dòng)調(diào)用回調(diào)函數(shù)實(shí)現(xiàn)相同的效果隔心。

2. 適用場(chǎng)景

  • computed:需要處理復(fù)雜邏輯的模板表達(dá)式白群。
  • watch:需要執(zhí)行異步或開銷較大的操作。

從表現(xiàn)上看硬霍,computed 會(huì)創(chuàng)建新的屬性帜慢,而 watch 可以通過將屬性設(shè)置在 data 中,再監(jiān)聽依賴屬性變化唯卖,調(diào)用 handler 方法更新屬性的方式達(dá)到同樣的效果粱玲。因此不難得出 computed 的使用場(chǎng)景可以被 watch 覆蓋這一結(jié)論。但在具體的使用上還是優(yōu)先考慮 computed拜轨,因?yàn)橄嗤瑘?chǎng)景下 watch 所需的代碼量和性能開銷一般來說會(huì)比 computed 大抽减,具體可以參照 computed vs watched。在 computed 無法滿足需求的情況下再考慮使用 watch橄碾,也可以有效避免 watch 濫用卵沉,提升性能。

3. Vue3 與 Vue2 區(qū)別

Vue3 中 computed 和 watch 的原理以及在 Options API 中的使用方式和 Vue2 保持一致法牲。但在 Vue3 的新特性組合式(Composition)API 中偎箫,使用方式和功能相比 Vue2 有了明顯差別。使用方式由原來在組件中聲明改為直接從 Vue 中導(dǎo)入使用皆串,各自的調(diào)用方式和參數(shù)也發(fā)生了改變,功能更加多樣眉枕,同時(shí) Vue3 還引入了 watchEffect 作為 watch 的補(bǔ)充恶复,以求用更簡(jiǎn)潔的代碼來覆蓋更廣的使用場(chǎng)景。具體使用參考官方文檔速挑。

參考資料

2. Vuejs 源碼

3. Vue3 組合式 api

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谤牡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姥宝,更是在濱河造成了極大的恐慌翅萤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腊满,死亡現(xiàn)場(chǎng)離奇詭異套么,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碳蛋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門胚泌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肃弟,你說我怎么就攤上這事玷室×闳兀” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵穷缤,是天一觀的道長(zhǎng)敌蜂。 經(jīng)常有香客問我,道長(zhǎng)津肛,這世上最難降的妖魔是什么章喉? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮快耿,結(jié)果婚禮上囊陡,老公的妹妹穿的比我還像新娘。我一直安慰自己掀亥,他們只是感情好撞反,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搪花,像睡著了一般遏片。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撮竿,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天吮便,我揣著相機(jī)與錄音,去河邊找鬼幢踏。 笑死髓需,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的房蝉。 我是一名探鬼主播僚匆,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搭幻!你這毒婦竟也來了咧擂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤檀蹋,失蹤者是張志新(化名)和其女友劉穎松申,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俯逾,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸桶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桌肴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刨啸。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖识脆,靈堂內(nèi)的尸體忽然破棺而出设联,到底是詐尸還是另有隱情善已,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布离例,位于F島的核電站换团,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宫蛆。R本人自食惡果不足惜艘包,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耀盗。 院中可真熱鬧想虎,春花似錦、人聲如沸叛拷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忿薇。三九已至裙椭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間署浩,已是汗流浹背揉燃。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筋栋,地道東北人炊汤。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弊攘,于是被迫代替她去往敵國(guó)和親抢腐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • computed 與 watch 作為 vue 的兩大監(jiān)聽器肴颊,在vue中是必不可少的。那么他們有什么區(qū)別呢 渣磷? 1...
    zhudying閱讀 268評(píng)論 0 3
  • 計(jì)算屬性computed : 1婿着、支持緩存,只有依賴數(shù)據(jù)發(fā)生改變醋界,才會(huì)重新進(jìn)行計(jì)算2竟宋、不支持異步,當(dāng)compute...
    啵崽崽閱讀 385評(píng)論 0 1
  • computed 計(jì)算屬性 支持緩存形纺,只有依賴數(shù)據(jù)發(fā)生改變丘侠,才會(huì)重新進(jìn)行計(jì)算 不支持異步,當(dāng)computed內(nèi)有異...
    一條小魯班閱讀 243評(píng)論 0 0
  • computed : 計(jì)算屬性 重點(diǎn)是得到一個(gè)數(shù)據(jù) 使用時(shí)不需要加括號(hào)它會(huì)將計(jì)算的結(jié)果自動(dòng)緩存只有在依賴屬性改變后...
    散步未歸閱讀 103評(píng)論 0 0
  • 計(jì)算屬性computed: 支持緩存逐样,只有依賴數(shù)據(jù)發(fā)生改變蜗字,才會(huì)重新進(jìn)行計(jì)算 不支持異步打肝,當(dāng)computed內(nèi)有異...
    那是陽光明媚閱讀 13,112評(píng)論 0 9