深入剖析Vue 3的shallowRef函數

一、什麼是shallowRef函數

shallowRef函數是Vue 3中一個響應式函數,它可以將傳入的非響應式對象轉換為響應式對象,並且可以讓這個對象成為響應式狀態的根源,當對象發生變化時,會讓所有引用該對象的組件或者函數重新渲染。

shallowRef函數與ref函數的不同之處在於它僅對對象的第一層進行響應式處理,第二層及以下的屬性變化將不會觸發更新。這種特性常用於性能優化。


import { shallowRef } from 'vue'

const obj = { name: 'Tom', age: 20 }
const objRef = shallowRef(obj)

console.log(objRef.value.name) // Tom

objRef.value.name = 'Jerry' // 觸發組件渲染

二、shallowRef函數的使用場景

使用shallowRef函數一般意味著你需要用到對象的第一層屬性,並且這些屬性的變化需要觸發組件更新。常見的使用場景有:

1、對象屬性在模板中使用

當對象的第一層屬性在組件模板中展示時,常用shallowRef函數將對象轉換為響應式對象,這樣在屬性發生變化時能夠觸發組件的重新渲染。


<template>
  <div>
    <p>Name: {{ user.name }}</p>
    <p>Age: {{ user.age }}</p>
  </div>
</template>

<script>
  import { shallowRef } from 'vue'

  export default {
    setup() {
      const user = shallowRef({ name: 'Tom', age: 20 })
      return { user }
    }
  }
</script>

2、對象作為函數參數傳遞

當對象作為函數參數傳遞時,常用shallowRef函數將對象轉換為響應式對象,這樣在函數內部修改對象的屬性時能夠觸發組件的重新渲染。


<template>
  <div>
    <p>Name: {{ user.name }}</p>
    <p>Age: {{ user.age }}</p>
    <button @click="updateUser">Update</button>
  </div>
</template>

<script>
  import { shallowRef } from 'vue'

  export default {
    setup() {
      const user = shallowRef({ name: 'Tom', age: 20 })

      function updateUser() {
        // 修改對象屬性,觸發組件重新渲染
        user.value.name = 'Jerry'
        user.value.age = 21
      }

      return { user, updateUser }
    }
  }
</script>

三、shallowRef函數的注意事項

1、使用shallowRef函數的對象不應該是一個響應式對象

當使用shallowRef函數將一個已經是響應式對象的對象再次轉換為響應式對象時,會出現以下錯誤:


const obj = reactive({ name: 'Tom', age: 20 })
const objRef = shallowRef(obj) // 報錯:不能將已經是響應式的對象轉換為響應式對象

2、不要濫用shallowRef函數

由於shallowRef函數的特性,只會對對象的第一層進行響應式處理,當對象的更深層次的屬性變化時,不會觸發組件重新渲染,容易出現更新不及時的情況。因此,在使用shallowRef函數時,需慎重考慮對象的屬性結構,以免濫用。

3、使用shallowRef函數的對象不要包含函數屬性

當對象包含函數屬性時,使用shallowRef函數將會把函數當做對象的屬性進行處理,而函數屬性本身不應該被響應式處理。


const obj = { name: 'Tom', sayHello: function() { console.log('Hello!') } }
const objRef = shallowRef(obj) // 函數屬性不應該被響應式處理

四、shallowRef函數的優化應用

shallowRef函數由於只會對對象的第一層進行響應式處理,可以用於優化組件性能。通常情況下,當一個對象的第一層屬性發生變化時,組件需要重新渲染,而對象深層次的屬性發生變化時,渲染沒有必要,因此使用shallowRef函數可以有效避免不必要的組件渲染,提高應用程序性能。

例如,在Vue 3中使用shallowRef函數優化一個包含子組件的列表時:


<template>
  <div>
    <div v-for="item in list" :key="item.id">
      <my-component :item="item" :is-active="item.isActive" />
      <button @click="update(item)">Update</button>
    </div>
  </div>
</template>

<script>
  import { shallowRef } from 'vue'
  import MyComponent from './MyComponent.vue'

  export default {
    components: { MyComponent },
    setup() {
      const list = shallowRef([
        { id: 1, name: 'Item 1', isActive: false },
        { id: 2, name: 'Item 2', isActive: false },
        { id: 3, name: 'Item 3', isActive: false }
      ])

      function update(item) {
        item.isActive = !item.isActive // 只更新對象的第一層屬性,避免不必要的渲染
      }

      return { list, update }
    }
  }
</script>

五、總結

通過本文的介紹,我們對Vue 3的shallowRef函數有了更深入的了解。shallowRef函數提供了性能優化的方案,但也存在一些需要注意的問題。在實際使用時,需要根據對象的屬性結構以及業務需求進行慎重考慮,避免濫用和出現不必要的問題。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/162644.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-21 22:46
下一篇 2024-11-21 22:46

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29

發表回復

登錄後才能評論