Vue3中ref和reactive的基本使用及區別詳析
前言
今天給大傢講一下在vue3中ref和reactive的使用方法,以及他們的使用區別在哪裡,下面通過一個簡單的計數器的例子來給大傢進行說明
ref—計數器案例
ref 主要用於基本類型的響應,看如下代碼:
import { ref } from 'vue' // 導入ref interface DataProps { count: number; double: number; increase: () => void } export default { name: 'App', setup() { const count = ref(0) const double = computed(() => { return count.value*2 }) const increase = () => { count.value++ } return { count, double, increase } } }
在setup方法通過ref實現響應式對象,最後要在return中進行返回。
我們發現幾個變量都分散在各處,那麼有沒有什麼辦法可以將他們包裹在對象裡呢?那就來看看下面的reactive
reactive—計數器案例
reactive:主要用於引用類型的響應。裡面屬性拿出來單獨使用,可能會喪失響應性
代碼如下(示例):
import { reactive, toRefs } from 'vue' interface DataProps { count: number; double: number; increase: () => void } export default { name: 'App', setup() { const data: DataProps = reactive({ count: 0, increase: () => { data.count++ }, double: computed(() => data.count * 2) }) const refData = toRefs(data) refData.double return { ...refData } } }
定義一個data對象,在裡面定義參數
在return中我們需要讓變量保持響應式,那麼就需要使用toRefs,就可以將普通的類型變為ref響應式類型
PS:在return裡面使用…refData(前面加三點),那麼在使用的時候就可以直接使用變量名,例如:< h1> {{count}} < /h1>
區別
通過上面的例子,大傢應該對ref和reactive有瞭一些瞭解,下面通過標準的 js 來進行類比,幫助大傢更好的理解區別:
類似使用ref
先定義x,y為0,當使用函數時,再更新x和y的值
let x = 0 let y = 0 function updataNumber() { x = 2 y = 3 }
類似使用 reactive
在pos中有兩個key都為0,在函數中更新兩個值pos.x = 2.
x,y必須和對象在一起才能引用,如果像第三種const { x } = pos,先取出來,再進行更新,x還是舊的值,並且會喪失響應式
const pos = { x: 0, y: 0, } function updata Object() { pos.x = 2 pos.y = 3 } const { x } = pos pos.x = 3
附:ref和reative的使用心得
一般來說,vue定義響應式變量有兩種寫法:
1)寫法1:reative聲明所有變量,最後return的時候一起toRefs
一種是把reative當做vue2的data,所有變量用reative一次性生成,最後一起toRefs(這個註意不要漏)。優點是賦值不用寫.value
<template> <h2>name: {{state.name}}</h2> <h2>age: {{state.age}}</h2> <h2>wife: {{state.wife}}</h2> <hr> <button @click="update">更新</button> </template> <script> /* reactive: 作用: 定義多個數據的響應式 const proxy = reactive(obj): 接收一個普通對象然後返回該普通對象的響應式代理器對象 響應式轉換是“深層的”:會影響對象內部所有嵌套的屬性 內部基於 ES6 的 Proxy 實現,通過代理對象操作源對象內部數據都是響應式的 */ import { reactive,toRefs } from 'vue' export default { setup () { /* 定義響應式數據對象 */ const state = reactive({ name: 'tom', age: 25, wife: { name: 'marry', age: 22 }, }) console.log(state, state.wife) const update = () => { state.name += '--' state.age += 1 state.wife.name += '++' state.wife.age += 2 } return { ...toRefs(state) } } } </script>
2)寫法2:從頭到尾都用ref聲明變量,賦值的時候要註意加.value
第二種,從頭到尾都用ref,除瞭賦值時要.value很麻煩,其他倒沒什麼。
<template> <h2>{{count}}</h2> <hr> <button @click="update">更新</button> </template> <script> import { ref } from 'vue' export default { setup () { // 定義響應式數據 ref對象 const count = ref(1) console.log(count) // 更新響應式數據的函數 function update () { // alert('update') count.value = count.value + 1 } return { count, update } } } </script>
總結
通過例子和js原生例子類比給大傢講瞭ref和reactive的使用及區別。在實際項目中,大傢還是需要根據自己平時的編程習慣來選擇對應的方法。
到此這篇關於Vue3中ref和reactive的基本使用及區別的文章就介紹到這瞭,更多相關Vue3 ref和reactive使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue3常用的API使用簡介
- vue組合式API淺顯入門示例詳解
- vue3如何定義變量及ref、reactive、toRefs特性說明
- Vue3中的ref和reactive響應式原理解析
- Vue3如何理解ref toRef和toRefs的區別