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!

推薦閱讀: