首頁 > 軟體

Vue3中ref和reactive的基本使用及區別詳析

2022-07-15 18:00:39

前言

今天給大家講一下在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使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com