成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

訴諸 Vue 組合式 API 解構 Props

開發 前端
讀寫 props? 對象時,我們要做的第一件事可能是,解構 props? 對象,然后讀寫各個屬性。但當我學習 Vue 組合式 API 時,令我大吃一驚的是,解構的 props 丟失了響應性!

大家好,這里是大家的林語冰。

響應式 API 賦予了組合式 API 一大坨可能性的同時,代碼精簡。雖然但是,我們應該意識到響應性的某些陷阱,比如丟失響應性。

在本文中,我們將學習如何正確解構 Vue 組件的 props,使得 props 不會丟失響應性。

1. 解構 props

編譯器宏 defineProps() 可以輔助讀寫提供給 <script setup> 中的組件的 props:

圖片圖片

上述示例中,props 是一個響應式對象,包含了提供給組件的 props。如果組件 props 變化了,props 響應式對象也會隨之變化。

讀寫 props 對象時,我們要做的第一件事可能是,解構 props 對象,然后讀寫各個屬性。但當我學習 Vue 組合式 API 時,令我大吃一驚的是,解構的 props 丟失了響應性!

讓我們來看一個例子。下述組件 <EvenOdd :count="5"> 接受 count 屬性作為數字,并顯示一條消息,無論 count 是偶數還是奇數。

在解構 props 對象 const { count } = defineProps() 之后,訪問該 count 屬性:

圖片圖片

單擊幾次增加按鈕。您會注意到,盡管 count 屬性不斷累加,但 "The number is even" 消息始終保持不變。

當解構 props 對象 const { count } = defineProps() 時,響應性就會丟失。

響應性之所以會丟失,是因為在解構時 count 變異為具有原始值的變量(一個平平無奇的數字罷了)。但 Vue 的響應性不能直接作用于原始值:Vue 必須訴諸 ref 或響應式對象。

粉絲請注意,在 Vue 中將原始值直接賦值給變量時要小心:此乃丟失響應性的前提。

2. 解決方案 1:使用“props”對象

第一個顯而易見的解決方案是,不要解構 props 對象,并使用屬性讀寫器直接讀寫 props: props.count。

圖片圖片

上述示例中,讀寫 computed() 內的 props.count 可以在 props.count 變更時保留響應性。props 對象是響應式的,對其進行任何變更都會被正確追蹤。

這種方案的短板是,我們必須始終使用屬性讀寫器(比如 props.count)來讀寫 <script setup 中的 prop。

解決方案 2:使用 toRefs() 輔助函數

如果您閱讀至此,我敢打賭您是解構賦值的忠實粉絲,并且沒有它就活不下去。

問題不大,那么您可以有意識地將 props 對象的每個屬性轉換為 ref,來保留解構 props 的響應性。Vue 提供了一個特殊的輔助函數 toRefs(reactiveObject) 來精準完成此操作。

其工作機制如下:

圖片圖片

toRefs(props) 返回一個對象,其中每個屬性都是對相應 prop 的 ref。

現在解構 const { count } = toRefs(props) 是安全的,因為 count 是基于 count 屬性的 ref。現在,每次 count 屬性變更時,count 的 ref 都會響應屬性更改。

將 count 作為 ref,在 computed() 內,我們必須使用 count.value 讀寫 prop 的值(因為 count.value 是我們讀寫 ref 的值的方式)。

我發現此方案可以方便地將 prop ref 作為參數傳遞給組合式函數:比如 useMyComposable(count),并且不會丟失響應性。

否則,我會堅持之前的方案,直接使用 props 對象讀寫 prop。

4. 總結一下

粉絲請注意,通過應用解構 const { propA, propB } = defineProps(),我們會丟失 props 的響應性。

解決響應性丟失的方案主要有兩種:

不解構 props,而是訴諸屬性讀寫器直接讀寫 props:比如 props.xxx/props.cat。

有意識地使用 props 作為 refs 的對象:const { propA, propB } = toRefs(props)。這保留了解構后的響應性。然后我們可以將屬性作為獨立 ref 讀寫,比如 propsA.value/propB.value 等。

責任編輯:武曉燕 來源: 人貓神話
相關推薦

2022-06-13 08:39:21

Vue3API

2024-06-20 13:50:53

Vue 3API開發

2025-03-14 08:01:19

2023-04-19 08:12:00

VueAPI組合式

2022-03-24 15:28:43

Vue開發框架

2022-03-11 12:31:04

Vue3組件前端

2020-07-10 11:30:29

組合式架構傳統存儲存儲

2015-01-28 09:59:00

IBM混合云

2025-03-26 10:29:22

Vue3前端API

2017-11-02 08:44:50

組合式存儲架構

2024-06-25 12:20:31

2025-02-25 08:51:19

2022-02-22 07:37:26

VuePinia態管理庫

2022-06-21 12:09:18

Vue差異

2021-12-15 08:23:42

Vue3 插件Vue應用

2021-12-01 08:11:44

Vue3 插件Vue應用

2025-01-20 00:00:06

Vue開發工具庫

2020-12-01 08:34:31

Vue3組件實踐

2021-12-02 05:50:35

Vue3 插件Vue應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 妞干网福利视频 | 九九热在线免费视频 | 中文字幕一区二区三区乱码图片 | 亚洲人va欧美va人人爽 | 国产午夜精品一区二区三区四区 | 99精品99 | 97中文视频| 国产一级久久久久 | 亚洲精彩视频在线观看 | 亚洲成人自拍 | 亚洲成人精品 | 国产精品1区2区 | 国产精品99久久久久久久久 | 黄色毛片免费视频 | 欧美色性| 久久久久国产 | 亚洲一区二区精品视频 | 亚洲一区三区在线观看 | 在线成人免费av | 超碰免费观看 | 久久伊人免费视频 | 能看的av| 男女下面一进一出网站 | 色婷婷综合久久久久中文一区二区 | 99久久久久久99国产精品免 | 日韩在线播放中文字幕 | 一区二区三区亚洲 | 欧美日韩综合精品 | 欧美日韩网站 | 亚洲视频一区在线 | 色综合99 | 一区二区福利视频 | 国产目拍亚洲精品99久久精品 | 操久久 | 国产激情在线 | 欧洲av一区 | 久久精品国产久精国产 | 欧美成人hd | 亚洲精品一区二三区不卡 | 中文字幕一级毛片 | 欧洲成人午夜免费大片 |