computed、watch和watchEffect區(qū)別

  • computed: 計(jì)算屬性將基于它們的響應(yīng)依賴關(guān)系緩存,本質(zhì)上是為了簡化模版中的邏輯
const firstName = ref("Mir");
const secondName=  ref("joy");
const fullName = computed(()=> firstName.value +" "+secondName.value)

支持set方法:

 let fullName = computed({
      get: () => firstName.value +" "+secondName.value,
      set: val => {
        console.log("...")
        firstName.value = val.split(" ")[0];
        secondName.value = val.split(" ")[1];
      }
    });
fullName.value = "hong xingshi"
<div>{{fullName}} {{fullName}} </div>

模版引用兩次,但是只會執(zhí)行一次運(yùn)算,只有當(dāng)firstName和secondName變化時才會重新計(jì)算; 如果是普通函數(shù)就會執(zhí)行兩次運(yùn)算

支持調(diào)試Computed,僅開發(fā)模式生效:

const plusOne = computed(() => count.value + 1, {
  onTrack(e) {
    // 當(dāng) count.value 作為依賴被追蹤時觸發(fā)
    debugger
  },
  onTrigger(e) {
    // 當(dāng) count.value 被修改時觸發(fā)
    debugger
  }
})
// 訪問 plusOne,應(yīng)該觸發(fā) onTrack
console.log(plusOne.value)
// 修改 count.value,應(yīng)該觸發(fā) onTrigger
count.value++

  • watch: 監(jiān)聽屬性用于監(jiān)聽屬性的變化,監(jiān)聽屬性范圍更廣,當(dāng)需要在數(shù)據(jù)變化時執(zhí)行異步開銷較大的操作時,這個方式是最有用的
    1.監(jiān)聽單一源
// 偵聽一個 getter
const state = reactive({ count: 0 })
watch(
  () => state.count,
  (count, prevCount) => {
    /* 執(zhí)行異步或者開銷較大的操作,比如獲取發(fā)起后端請求*/
  }
)
// 直接偵聽一個 ref
const count = ref(0)
watch(count, (count, prevCount) => {
  /* ... */
})

2.監(jiān)聽多個源

watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
  /* ... */
})

3.嘗試檢查深度嵌套對象或數(shù)組中的 property 變化時,仍然需要 deep 選項(xiàng)設(shè)置為 true

const state = reactive({ 
  id: 1,
  attributes: { 
    name: '',
  }
})

watch(
  () => state,
  (state, prevState) => {
    console.log('not deep', state.attributes.name, prevState.attributes.name)
  }
)

watch(
  () => state,
  (state, prevState) => {
    console.log('deep', state.attributes.name, prevState.attributes.name)
  },
  { deep: true }
)

state.attributes.name = 'Alex' // 日志: "deep" "Alex" "Alex"
//{ immediate: true} 代表立即以表達(dá)式的當(dāng)前值觸發(fā)回調(diào)
  • watchEffect 是vue3新特性,立即執(zhí)行傳入的一個函數(shù),同時響應(yīng)式追蹤其依賴,并在其依賴變更時重新運(yùn)行該函數(shù),函數(shù)用到哪個屬性就監(jiān)聽哪個屬性
const count = ref(0)

watchEffect(() => console.log(count.value))
// -> logs 0

setTimeout(() => {
  count.value++
  // -> logs 1
}, 100)

1.computed注重返回結(jié)果,watch和watchEffect注重過程不需要返回值
2.watch和watchEffect 支持異步調(diào)用 computed不支持
3.watch 可以訪問監(jiān)聽屬性的先前值和當(dāng)前值,而watchEffect只能訪問到當(dāng)前值
4.watchEffect函數(shù)支持取消異步api的請求和停止監(jiān)聽

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容