Vue3之toRefs和toRef在reactive中的一些應(yīng)用方式
回顧響應(yīng)式對象
在介紹知識(shí)點(diǎn)之前,我們準(zhǔn)備好初始代碼
<template> <h2>姓名:{{ person.name }}</h2> <h2>姓名:{{ person.age }}</h2> <button @click="change_name">修改名字</button> <button @click="change_age"></button> </template> <script lang="ts" setup name="Person11"> import {reactive} from 'vue' let person = reactive({ name:'饅頭', age:22 }) function change_name(){ person.name += '*' } function change_age(){ person.age += 1 } </script> <style scoped> .person { background-color: skyblue; box-shadow: 0 0 10px; border-radius: 10px; padding: 20px; } button { margin: 0 5px; } </style>
運(yùn)行結(jié)果如下
是否和你想的一樣呢,我們使用了reactive進(jìn)行創(chuàng)建響應(yīng)式對象
接下來我們對person進(jìn)行解構(gòu)賦值
或許有些人不太理解解構(gòu)賦值,我從網(wǎng)上找了一段話
- 解構(gòu)賦值是 JavaScript 中一種方便的語法,用于從數(shù)組或?qū)ο笾刑崛?shù)據(jù)并賦值給變量。通過解構(gòu)賦值,可以輕松地提取數(shù)組中的元素或?qū)ο笾械膶傩裕勾a更簡潔易讀。
- 它還可以嵌套使用,處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),但要注意避免過度解構(gòu),以保持代碼的可讀性。
接下來我們看看代碼中如何操作,只需在數(shù)據(jù)下面加一行
let {name,age} = person
接下來我們修改方法中的部分代碼
//原代碼 function change_name(){ person.name += '*' } function change_age(){ person.age += 1 } //修改之后的代碼 function change_name(){ name += '*' } function change_age(){ age += 1 }
這樣我們的頁面是否還會(huì)響應(yīng)呢,答案是不可以
如果我們再修改模板里面的內(nèi)容呢
<h2>姓名:{{ name }}</h2> <h2>姓名:{{ age }}</h2>
答案也是不更新的,但是數(shù)據(jù)究竟改沒改呢,我們打印一下
function change_name(){ name += '*' console.log(name) } function change_age(){ age += 1 console.log(age) }
控制臺(tái)結(jié)果顯示如下,所以說是改了的
接下來我們解釋一下
let {name,age} = person
上面這行代碼和下面兩行代碼其實(shí)是等價(jià)的
let name=person.name let age=person.age
同時(shí)我們要明確一點(diǎn),下圖的數(shù)據(jù)是響應(yīng)式的
但是我們解構(gòu)后相當(dāng)于自己重新定義了一個(gè)對象name和age,然后person.name和person.age是不變的
多說無益,我們測試一下叭
function change_name(){ name += '*' console.log(name, person.name) }
結(jié)果顯然了叭,結(jié)論就是:響應(yīng)式對象解構(gòu)出的并非是響應(yīng)式對象
介紹toRefs
承接上個(gè)標(biāo)題,我們?nèi)绻胍獙⒔鈽?gòu)的對象變?yōu)轫憫?yīng)式的,我們應(yīng)該怎么做呢,只需要import一個(gè)toRefs
import {reactive,toRefs} from 'vue'
同時(shí)我們再將解構(gòu)的person包裹一下toRefs
let {name,age} = toRefs(person)
這樣的意思就是,將解構(gòu)的數(shù)據(jù)變?yōu)镽ef定義的響應(yīng)式對象,將reactive對象變?yōu)镽ef對象
接下來我們改一下方法
function change_name(){ name.value += '*' console.log(name, person.name) } function change_age(){ age.value += 1 console.log(age) }
這樣我們再測試一下
介紹toRef(不常用)
toRef和toRefs是 Vue3 中用于處理響應(yīng)式對象的兩個(gè)函數(shù),它們有一些重要的區(qū)別:
toRef:
- 參數(shù):接收一個(gè)響應(yīng)式對象和一個(gè)屬性名,返回一個(gè) ref 對象,指向該屬性的值。
- 用途:主要用于將單個(gè)屬性轉(zhuǎn)換為 ref 對象,使得該屬性的值能夠被響應(yīng)式地跟蹤。
toRefs:
- 參數(shù):接收一個(gè)響應(yīng)式對象,返回一個(gè)包含該對象所有屬性的 ref 對象。
- 用途:常用于在組件中將 props 轉(zhuǎn)換為響應(yīng)式對象,或者在 setup 函數(shù)中處理響應(yīng)式對象的多個(gè)屬性。
總的來說,toRef用于處理單個(gè)屬性,將其轉(zhuǎn)換為 ref 對象,而toRefs用于處理整個(gè)對象,將對象的所有屬性都轉(zhuǎn)換為 ref 對象
總結(jié)
本節(jié)介紹了一下toRefs和toRef,同時(shí)回憶了一下reactive
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue-element-admin平臺(tái)側(cè)邊欄收縮控制問題
這篇文章主要介紹了Vue-element-admin平臺(tái)側(cè)邊欄收縮控制問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue監(jiān)聽屏幕尺寸變化問題,window.onresize很簡單
這篇文章主要介紹了vue監(jiān)聽屏幕尺寸變化問題,window.onresize很簡單,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue中使用echarts以及簡單關(guān)系圖的點(diǎn)擊事件方式
這篇文章主要介紹了vue中使用echarts以及簡單關(guān)系圖的點(diǎn)擊事件方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06解決vue?app.js/vender.js過大優(yōu)化啟動(dòng)頁
這篇文章主要為大家介紹了解決vue?app.js/vender.js過大優(yōu)化啟動(dòng)頁過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10vue3封裝Element導(dǎo)航菜單的實(shí)例代碼
這篇文章主要介紹了vue3封裝Element導(dǎo)航菜單的實(shí)例代碼,分為菜單數(shù)據(jù)格式示例,控制導(dǎo)航收縮的詳細(xì)代碼,本文通過實(shí)例代碼介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03