Vue3中ref和reactive的使用場(chǎng)景詳解
Vue3中ref和reactive的使用場(chǎng)景
一、核心區(qū)別
特性 | ref | reactive |
---|---|---|
數(shù)據(jù)類型 | 基本類型 + 對(duì)象/數(shù)組(自動(dòng)解包) | 僅對(duì)象/數(shù)組 |
響應(yīng)式原理 | 通過(guò) .value 觸發(fā)響應(yīng) | 直接代理對(duì)象 |
模板中使用 | 自動(dòng)解包(無(wú)需 .value) | 直接訪問(wèn)屬性 |
解構(gòu)/傳遞 | 保持響應(yīng)性 | 需用 toRefs 保持響應(yīng)性 |
二、使用場(chǎng)景與案例
1. ref 的典型場(chǎng)景
(1) 管理基本類型值
import { ref } from 'vue' // 計(jì)數(shù)器(數(shù)字) const count = ref(0) const increment = () => { count.value++ // 修改值必須用 .value } // 開(kāi)關(guān)狀態(tài)(布爾值) const isOpen = ref(false) const toggle = () => { isOpen.value = !isOpen.value }
(2) 引用 DOM 元素
<template> <input ref="inputRef" /> </template> <script setup> import { ref, onMounted } from 'vue' const inputRef = ref(null) onMounted(() => { inputRef.value.focus() // 訪問(wèn) DOM 元素 }) </script>
(3) 需要整體替換對(duì)象/數(shù)組
const user = ref({ name: 'Alice', age: 25 }) // 替換整個(gè)對(duì)象 user.value = { name: 'Bob', age: 30 } const list = ref(['apple', 'banana']) // 替換整個(gè)數(shù)組 list.value = ['orange', 'grape']
2. reactive 的典型場(chǎng)景
(1) 復(fù)雜表單對(duì)象
import { reactive } from 'vue' const form = reactive({ username: '', password: '', rememberMe: false }) // 直接修改屬性(無(wú)需 .value) form.username = 'John'
(2) 嵌套數(shù)據(jù)結(jié)構(gòu)
const nestedData = reactive({ user: { profile: { name: 'Alice', address: { city: 'Shanghai' } } } }) // 深層嵌套修改仍保持響應(yīng)性 nestedData.user.profile.address.city = 'Beijing'
(3) 數(shù)組操作
const items = reactive(['a', 'b', 'c']) // 直接修改元素 items[0] = 'z' // 響應(yīng)式更新 items.push('d') // 使用數(shù)組方法
三、關(guān)鍵操作指南
1. 正確賦值/修改
ref 示例:
const count = ref(0) // ? 正確修改 count.value = 10 // ? 錯(cuò)誤!直接賦值會(huì)覆蓋 ref 對(duì)象 count = 10
reactive 示例:
const state = reactive({ count: 0 }) // ? 正確修改屬性 state.count = 10 // ? 錯(cuò)誤!直接替換對(duì)象會(huì)失去響應(yīng)性 state = { count: 20 } // ? 保持響應(yīng)性的對(duì)象替換方式 Object.assign(state, { count: 20 })
2. 處理響應(yīng)式丟失
(1) 解構(gòu) reactive 對(duì)象
const state = reactive({ x: 1, y: 2 }) // ? 解構(gòu)后失去響應(yīng)性 const { x, y } = state // ? 使用 toRefs 保持響應(yīng)性 const { x, y } = toRefs(state) x.value = 10 // 現(xiàn)在修改有效
(2) 函數(shù)間傳遞
// ? 傳遞整個(gè) reactive 對(duì)象 const user = reactive({ name: 'Alice' }) updateUser(user) function updateUser(userObj) { userObj.name = 'Bob' // 修改仍響應(yīng) } // ? 傳遞 ref 對(duì)象 const count = ref(0) increment(count) function increment(numRef) { numRef.value++ }
四、性能與最佳實(shí)踐
優(yōu)先選擇:
- 基本類型 →
ref
- 復(fù)雜對(duì)象 →
reactive
- 需要靈活替換 →
ref
(即使存儲(chǔ)對(duì)象)
注意事項(xiàng):
- 避免在
reactive
中嵌套ref
(除非明確需要) - 對(duì)數(shù)組進(jìn)行索引操作時(shí),建議使用變更方法(
push/pop
等) - 大型數(shù)據(jù)集考慮
shallowRef
/shallowReactive
提升性能
五、綜合對(duì)比案例
<script setup> import { ref, reactive } from 'vue' // ref 管理用戶ID(基本類型) const userId = ref(123) // reactive 管理用戶詳情(對(duì)象) const userDetail = reactive({ name: 'Alice', permissions: ['read', 'write'] }) // 修改操作示例 const updateUser = () => { // 修改 ref userId.value = 456 // 修改 reactive 對(duì)象 userDetail.name = 'Bob' userDetail.permissions.push('delete') } // 替換整個(gè)對(duì)象的最佳實(shí)踐 const resetUser = () => { // ref 可以直接替換 userId.value = 0 // reactive 應(yīng)該合并屬性而非直接賦值 Object.assign(userDetail, { name: 'Guest', permissions: [] }) } </script>
通過(guò)以上案例可以看出:ref
更適合管理獨(dú)立值和需要完全替換的場(chǎng)景,而 reactive
在處理復(fù)雜對(duì)象結(jié)構(gòu)時(shí)更直觀。根據(jù)具體需求靈活選擇,可顯著提升代碼可維護(hù)性。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue使用webSocket更新實(shí)時(shí)天氣的方法
本文將結(jié)合實(shí)例代碼,介紹vue使用webSocket更新實(shí)時(shí)天氣的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06vue 路由緩存 路由嵌套 路由守衛(wèi) 監(jiān)聽(tīng)物理返回操作
這篇文章主要介紹了vue 路由緩存 路由嵌套 路由守衛(wèi) 監(jiān)聽(tīng)物理返回操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08VUE寫(xiě)一個(gè)簡(jiǎn)單的表格實(shí)例
在本篇文章里小編給大家整理的是關(guān)于VUE中表格的寫(xiě)法實(shí)例以及相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以參考下。2019-08-08Vue項(xiàng)目的表單校驗(yàn)實(shí)戰(zhàn)指南
這篇文章主要介紹了Vue項(xiàng)目表單校驗(yàn)的相關(guān)資料,前端表單校驗(yàn)?zāi)軠p少無(wú)效請(qǐng)求,保護(hù)后端接口,使用ElementPlus表單組件進(jìn)行校驗(yàn),需要準(zhǔn)備表單對(duì)象、規(guī)則對(duì)象并進(jìn)行雙向綁定,用戶名、密碼以及協(xié)議勾選等字段都需符合特定規(guī)則,需要的朋友可以參考下2024-10-10vue實(shí)現(xiàn)集成騰訊TIM即時(shí)通訊
最近在做商城類的項(xiàng)目,需要使用到客服系統(tǒng),用戶選擇的騰訊IM即時(shí)通信,所以本文主要介紹了vue實(shí)現(xiàn)集成騰訊TIM即時(shí)通訊,感興趣的可以了解一下2021-06-06vue3第二次傳遞數(shù)據(jù)方法無(wú)法獲取到最新的值的解決方法
這篇文章主要介紹了vue3第二次傳遞數(shù)據(jù)方法無(wú)法獲取到最新的值,本文通過(guò)實(shí)例圖文相結(jié)合給大家詳細(xì)講解,感興趣的朋友一起看看吧2025-04-04vue.js評(píng)論發(fā)布信息可插入QQ表情功能
這篇文章主要為大家詳細(xì)介紹了vue.js評(píng)論發(fā)布信息可插入QQ表情功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08