Vue3之計(jì)算屬性與偵聽(tīng)器

計(jì)算屬性-computed:僅會(huì)在其響應(yīng)式依賴(lài)更新時(shí)才重新計(jì)算

1募闲、模板中的表達(dá)式雖然方便步脓,但模板中寫(xiě)太多邏輯,會(huì)讓模板變得臃腫浩螺,難以維護(hù)靴患。
2、computed具有緩存作用要出。

<script setup>
import { reactive, computed } from 'vue'
const author = reactive({
  name: 'John Doe',
  books: [
    'Vue 2 - Advanced Guide',
    'Vue 3 - Basic Guide',
    'Vue 4 - The Mystery'
  ]
})
// 一個(gè)計(jì)算屬性 ref
const publishedBooksMessage = computed(() => {
  return author.books.length > 0 ? 'Yes' : 'No'
})

function calculateBooksMessage() {
  return author.books.length > 0 ? 'Yes' : 'No'
}
</script>

<template>
  // 這么寫(xiě)當(dāng)然也可以鸳君,但是如果頁(yè)面中很多地方需要使用,模板就會(huì)很臃腫
  <span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>
  <span>{{ publishedBooksMessage }}</span>
  // 這么寫(xiě)當(dāng)然也可以患蹂,但是頁(yè)面重新渲染的時(shí)候或颊,方法會(huì)再次調(diào)用,而computed具有緩存作用則不會(huì)
  <span>{{ calculateBooksMessage() }}</span>
</template>

偵聽(tīng)器-watch&watchEffect:在每次響應(yīng)式狀態(tài)發(fā)生變化時(shí)觸發(fā)回調(diào)函數(shù)

計(jì)算屬性允許我們聲明性地計(jì)算衍生值传于。然而在有些情況下饭宾,我們需要在狀態(tài)變化時(shí)執(zhí)行一些“副作用”:例如更改 DOM,或是根據(jù)異步操作的結(jié)果去修改另一處的狀態(tài)

  • watch
<script setup>
import { ref, watch } from 'vue'
const question = ref('')
const obj = reactive({ count: 0 })
// 可以直接偵聽(tīng)一個(gè) ref
watch(question, async (newval, oldval) => {
  // 可以執(zhí)行一些異步操作或者dom更新
  const res = await fetch('https://yesno.wtf/api')
})

// 監(jiān)聽(tīng)對(duì)象屬性格了,注意第一個(gè)參數(shù)是一個(gè)方法看铆,切記不可以直接watch obj.count,因?yàn)榈玫降氖莕umber盛末,不具備響應(yīng)式
watch(
  () => obj.count,
  (count) => {
    console.log(`count is: ${count}`)
  }
)
// 深度監(jiān)聽(tīng):對(duì)象的屬性(含多層級(jí))發(fā)生改變弹惦,由于需要遍歷嵌套屬性,數(shù)據(jù)結(jié)構(gòu)太深開(kāi)銷(xiāo)會(huì)很大
watch(
  () => state.someObject,
  (newValue, oldValue) => {
    // 注意:`newValue` 此處和 `oldValue` 是相等的
    // *除非* state.someObject 被整個(gè)替換了
  },
  { deep: true }
)
// 即時(shí)回調(diào)的偵聽(tīng)器:watch是惰性的悄但,僅當(dāng)數(shù)據(jù)源變化時(shí)棠隐,才會(huì)執(zhí)行回調(diào)¢芟可以通過(guò)如下配置立即執(zhí)行
watch(source, (newValue, oldValue) => {
  // 立即執(zhí)行助泽,且當(dāng) `source` 改變時(shí)再次執(zhí)行
}, { immediate: true })
</script>
  • watchEffect
    我認(rèn)為watchEffect可以看做成watch+immediate: true+computed觸發(fā)機(jī)制的合寫(xiě)
// 這里不同的是啰扛,watchEffect第一個(gè)參數(shù)不需要寫(xiě)監(jiān)聽(tīng)的源
// 這個(gè)例子回調(diào)會(huì)立即執(zhí)行,相當(dāng)于immediate: true
watchEffect(async () => {
  const response = await fetch(
    // 這里有點(diǎn)像computed:每當(dāng) todoId.value 變化時(shí)嗡贺,回調(diào)會(huì)再次執(zhí)行
    `https://jsonplaceholder.typicode.com/todos/${todoId.value}`
  )
})
  • watch vs watchEffect
    相同點(diǎn):都能響應(yīng)式地執(zhí)行有副作用的回調(diào)
    不同點(diǎn):watch只追蹤明確偵聽(tīng)的數(shù)據(jù)源隐解,比如說(shuō)我監(jiān)聽(tīng)obj,只能監(jiān)聽(tīng)obj的屬性變化诫睬,但是watchEffect里面既可以監(jiān)聽(tīng)obj的屬性變化煞茫,也可以監(jiān)聽(tīng)其他對(duì)象的屬性變化。簡(jiǎn)單說(shuō)摄凡,watch追蹤更加明確续徽,而watchEffect則不太明確。
  • 回調(diào)的觸發(fā)時(shí)機(jī)
    當(dāng)你更改了響應(yīng)式狀態(tài)亲澡,它可能會(huì)同時(shí)觸發(fā) Vue 組件更新和偵聽(tīng)器回調(diào)钦扭。默認(rèn)情況下,偵聽(tīng)器回調(diào)的觸發(fā)在DOM更新之前床绪,這意味著你在偵聽(tīng)器回調(diào)中訪問(wèn)的 DOM 將是被 Vue 更新之前的狀態(tài)客情。如果想在偵聽(tīng)器回調(diào)中能訪問(wèn)被 Vue 更新之后的 DOM,可通過(guò)如下配置:
watch(source, callback, {
  flush: 'post'
})
watchEffect(callback, {
  flush: 'post'
})

// 后置刷新的 watchEffect() 有個(gè)更方便的別名 watchPostEffect()
import { watchPostEffect } from 'vue'
watchPostEffect(() => {
  /* 在 Vue 更新后執(zhí)行 */
})
  • 停止偵聽(tīng)器
const unwatch = watchEffect(() => {})
// ...當(dāng)該偵聽(tīng)器不再需要時(shí)
unwatch()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末会涎,一起剝皮案震驚了整個(gè)濱河市裹匙,隨后出現(xiàn)的幾起案子瑞凑,更是在濱河造成了極大的恐慌末秃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件籽御,死亡現(xiàn)場(chǎng)離奇詭異练慕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)技掏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)铃将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人哑梳,你說(shuō)我怎么就攤上這事劲阎。” “怎么了鸠真?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵悯仙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吠卷,道長(zhǎng)锡垄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任祭隔,我火速辦了婚禮货岭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己千贯,他們只是感情好屯仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著丈牢,像睡著了一般祭钉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上己沛,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天慌核,我揣著相機(jī)與錄音,去河邊找鬼申尼。 笑死垮卓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的师幕。 我是一名探鬼主播粟按,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼霹粥!你這毒婦竟也來(lái)了灭将?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤后控,失蹤者是張志新(化名)和其女友劉穎庙曙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浩淘,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捌朴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了张抄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砂蔽。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖署惯,靈堂內(nèi)的尸體忽然破棺而出左驾,到底是詐尸還是另有隱情,我是刑警寧澤极谊,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布诡右,位于F島的核電站,受9級(jí)特大地震影響怀酷,放射性物質(zhì)發(fā)生泄漏稻爬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一蜕依、第九天 我趴在偏房一處隱蔽的房頂上張望桅锄。 院中可真熱鬧琉雳,春花似錦、人聲如沸友瘤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辫秧。三九已至束倍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盟戏,已是汗流浹背绪妹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柿究,地道東北人邮旷。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蝇摸,于是被迫代替她去往敵國(guó)和親婶肩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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