您好,登錄后才能下訂單哦!
這篇文章主要介紹“Vue3中關于ref和reactive的問題怎么解決”,在日常操作中,相信很多人在Vue3中關于ref和reactive的問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Vue3中關于ref和reactive的問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
如果你使用過 Vue3,你知道的,在 Vue3 中有兩個非常常用的響應式 API:reactive 和 ref。它們會把我們想要追蹤的數據變成響應式。
而且我們在使用時一直被告知 ref 用于創建基礎類型的響應式,也可以創建引用類型的響應式。而對于引用類型,底層也是轉換為 reactive 來進行響應式處理。那既然這樣為撒還需要 reactive ,全部使用 ref 不就行了嗎?
雖然 ref 創建的響應式數據在腳本中需要通過 .value 才能訪問到呀!但是這里肯定影響不大。并且在模板中會自動添加上 .value,所以模板中不需要通過 .value 訪問。
既然這二者基本沒撒差別,但是還是暴露了 reactive 這個 API,難道有什么場景是 reactive 能做而 ref 做不了的?
我們先簡單了解一下這兩個 API。
reactive
返回對象的響應式副本,響應式轉換是“深層”的——它影響所有嵌套 property。我們一般這樣寫。
const obj = reactive({ count: 0 })
并且可以直接使用。
const count = obj.count
ref
受一個內部值并返回一個響應式且可變的 ref 對象。ref 對象僅有一個 .value property,指向該內部值。我們一般是這樣寫。
const data = ref(xxx)
引用的時候,一般會通過data.value的方式引用。
const dataValue = data.value
通過跟蹤 Vue3 的源代碼可以證明,當我們調用 ref 方法來定義響應式數據時,當參數為對象類型時,其實里面用的是 reactive 方法。也就是說上面的 data.value ,事實上是 reactive 方法創造出來的。
注意:
reactive 能做的 ref 也能做,并且還是用 reactive 做的
當 ref 的參數為對象時,用的就是 reactive 方法
在 Vue3 中,如果是把對象類型的數據弄成響應式,reactive 和 ref 都可以,且ref 內部是通過r eactive 來支持的。也就是說,你 reactive 能做的,我 ref 也能做。
簡單來說 ref 是在 reactive 上在進行了封裝進行了增強,所以在 Vue3 中 reactive 能做的,ref 也能做,reactive 不能做的,ref 也能做。
個人理解ref是reactive的語法糖,如:ref(1) 就等價于 reactive({value: 1});
平時項目ref一把梭,是可以的,問題也不大
Ref
ref數據響應式監聽。ref 函數傳入一個值作為參數,一般傳入基本數據類型,返回一個基于該值的響應式Ref對象,該對象中的值一旦被改變和訪問,都會被跟蹤到,就像我們改寫后的示例代碼一樣,通過修改 count.value 的值,可以觸發模板的重新渲染,顯示最新的值
<template> <h2>{{name}}</h2> <h2>{{age}}</h2> <button @click="sayName">按鈕</button> </template> <script lang="ts"> import {ref,computed} from 'vue' export default { name: 'App', setup(){ const name = ref('zhangsan') const birthYear = ref(2000) const now = ref(2020) const age = computed(()=>{ return now.value - birthYear.value }) const sayName = () =>{ name.value = 'I am ' + name.value } return { name, sayName, age } } } </script>
reactive
reactive是用來定義更加復雜的數據類型,但是定義后里面的變量取出來就不在是響應式Ref對象數據了
所以需要用toRefs函數轉化為響應式數據對象
將上面用ref寫的代碼轉化成reactive型的代碼
<template> <!-- <img alt="Vue logo" src="./assets/logo.png"> --> <div> <h2>{{ name }}</h2> <h2>{{ age }}</h2> <button @click="sayName">按鈕</button> </div> </template> <script lang="ts"> import { computed, reactive,toRefs } from "vue"; interface DataProps { name: string; now: number; birthYear: number; age: number; sayName: () => void; } export default { name: "App", setup() { const data: DataProps = reactive({ name: "zhangsan", birthYear: 2000, now: 2020, sayName: () => { console.log(1111); console.log(data.name); data.name = "I am " + data.name; console.log(data.name); }, age: computed(() => { return data.now - data.birthYear; }), }); const refData = toRefs(data) refData.age return { ...refData, }; }, }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
到此,關于“Vue3中關于ref和reactive的問題怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。