最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為什么在Vue3?setup()中直接解構(gòu)props會丟失響應(yīng)性詳解

 更新時(shí)間:2026年05月29日 11:10:54   作者:用戶3905133219288  
props是響應(yīng)式的,當(dāng)傳入新的prop時(shí),它將被更新,因?yàn)閜rops是響應(yīng)式的,這篇文章主要介紹了為什么在Vue3 setup()中直接解構(gòu)props會丟失響應(yīng)性的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

很多使用 Vue3 的朋友都遇到過一個(gè)問題:在 setup() 函數(shù)里直接解構(gòu) props,數(shù)據(jù)就不再響應(yīng)了。這是為什么呢?

我們先看一個(gè)例子。假設(shè)我們有一個(gè)組件,它接收一個(gè) user 屬性。在 setup() 里我們可能會這樣寫:

export default {
  props: ['user'],
  setup(props) {
    const { name } = props.user
    return { name }
  }
}

這樣寫看起來沒問題,但實(shí)際上,name 已經(jīng)失去了響應(yīng)性。父組件更新 user 時(shí),這里的 name 不會跟著變。

原因:理解 Vue3 的響應(yīng)式原理

要明白原因,得先知道 Vue3 的響應(yīng)式原理。Vue3 用 Proxy 來追蹤數(shù)據(jù)變化。props 本身是響應(yīng)式的,但當(dāng)你解構(gòu)出 props.user.name 時(shí),你拿到的是一個(gè)普通的值。這個(gè)值和原來的響應(yīng)式數(shù)據(jù)斷開了聯(lián)系。

一個(gè)比喻

就像你有一根水管,水在水管里流動。你把水接出來放到杯子里,水還在杯子里。但水管里再流動的水,就和杯子里的水沒關(guān)系了。

Vue3 的響應(yīng)式系統(tǒng)也是這樣工作的。它只能追蹤那些被 reactive 或 ref 包裹的數(shù)據(jù)。直接解構(gòu)出來的值,只是一個(gè)普通的 JavaScript 值,系統(tǒng)不知道這個(gè)值需要被追蹤。

正確的做法是什么?

那么,正確的做法是什么呢?有兩種方法。

方法一:避免提前解構(gòu)

不要提前解構(gòu),在模板里直接使用 props.user.name。這樣就能保持響應(yīng)性。

方法二:使用toRefs

import { toRefs } from 'vue'

export default {
  props: ['user'],
  setup(props) {
    const { user } = toRefs(props)
    const name = user.value.name
    return { name }
  }
}

toRefs 會把響應(yīng)式對象的每個(gè)屬性都轉(zhuǎn)成 ref。這樣解構(gòu)出來的屬性還是響應(yīng)式的。

注意細(xì)節(jié)

toRefs 處理的是 props 本身,不是 props.user。因?yàn)?nbsp;props 才是響應(yīng)式對象,props.user 可能只是一個(gè)普通對象。

如果你需要解構(gòu) props.user 里的屬性,可以這樣寫:

import { toRefs, reactive } from 'vue'

export default {
  props: ['user'],
  setup(props) {
    const user = reactive({ ...props.user })
    const { name } = toRefs(user)
    return { name }
  }
}

先用 reactive 包裹,再用 toRefs 解構(gòu)。這樣 name 就是響應(yīng)式的了。

特殊情況:將props值傳遞給函數(shù)

還有一種情況要注意。有些時(shí)候,你解構(gòu) props 是為了傳值給其他函數(shù)。比如:

setup(props) {
  const { id } = props
  fetchData(id)
}

這樣寫,id 變化時(shí),fetchData 不會重新執(zhí)行,因?yàn)檫@里的 id 只是一個(gè)普通值。

正確的寫法是用 watch 或 watchEffect

import { watch } from 'vue'

setup(props) {
  watch(
    () => props.id,
    (newId) => {
      fetchData(newId)
    }
  )
}

這樣,props.id 變化時(shí),fetchData 就會用新的 id 重新執(zhí)行。

總結(jié)

直接解構(gòu) props 會丟失響應(yīng)性,因?yàn)榻鈽?gòu)出來的是普通值。要保持響應(yīng)性,可以:

  1. 在模板里直接使用props.xxx
  2. 用 toRefs 處理后再解構(gòu)
  3. 需要響應(yīng)式地使用 props 值時(shí),記得用 watch 或 watchEffect

相關(guān)文章

最新評論

阳谷县| 新河县| 内丘县| 合江县| 拉孜县| 准格尔旗| 西峡县| 温州市| 和林格尔县| 醴陵市| 玛纳斯县| 湾仔区| 兴城市| 华阴市| 额济纳旗| 黄梅县| 江口县| 剑阁县| 惠安县| 白山市| 仪征市| 嫩江县| 孟州市| 广水市| 焦作市| 元江| 垣曲县| 苗栗市| 贡嘎县| 天等县| 济南市| 邯郸县| 湖南省| 天祝| 潼南县| 潞城市| 隆回县| 阳曲县| 彭泽县| 兴仁县| 聂拉木县|