uniapp$set詳解

在Uniapp中,uniapp$set是一個非常重要的API。本文將從不同的角度對其進行詳細的講解,幫助讀者更好地理解uniapp$set的功能和使用方法。

一、uniapp$set的基本語法

uniapp.$set(obj, key, value)

uniapp.$set是Vue.js中一個非常重要的工具函數,它主要用於改變Vue.js中響應式數據的值。uniapp.$set和Vue.set的語法完全一致,而Vue.set是Vue.js中的全局函數。

參數解釋:

  • obj:要修改的響應式對象;
  • key:要修改的對象屬性名稱;
  • value:要設置的新值。

下面我們通過一個示例來展示uniapp$set函數的使用方法:

// 頁面data中data對象
data: {
  userInfo: {
    name: '張三',
    age: 20,
    sex: '男'
  }
}

// 調用uniapp.$set修改響應式數據
uniapp.$set(this.userInfo, 'name', '李四');

上述代碼就是使用uniapp.$set修改userInfo對象中的name屬性值。

二、uniapp$set函數的使用場景

uniapp.$set主要用於解決Vue.js中對響應式數據的新增和刪除操作無法觸發視圖更新的問題。為了更好地理解這個場景,我們可以通過下面一個例子來加深印象:

假設現在我們有一個數據列表,我們通過點擊按鈕的方式添加和刪除數據。我們首先定義一個list數組:

data(){
  return{
    list:[]
  }
}

接下來我們定義一個add方法,每次調用它都會向list數組中添加一個新的對象:

add(){
  this.list.push({
    name:'張三',
    age:20,
    sex:'男'
  })
}

我們再定義一個remove方法,每次調用它都會刪除list數組中的最後一個元素:

remove(){
  this.list.splice(this.list.length-1,1)
}

如果我們直接使用push和splice方法來添加和刪除數據,問題就會出現了:每當我們添加或刪除一條數據時,視圖並不會立即更新,因為Vue.js幾乎無法對數據新增或刪除操作做出反應。

那麼我們可以利用uniapp.$set函數來解決這個問題。每當我們添加一條數據時,調用uniapp.$set函數來改變數組的值:

add() {
  this.$set(this.list, this.list.length, {
    name: '張三',
    age: 20,
    sex: '男'
  })
}

接下來我們來改造一下remove方法,使用$set方法來刪除list數組中的最後一個元素:

remove(){
  this.$set(this.list,this.list.length-1,null)
  this.list.pop()
}

這樣我們就可以使用uniapp.$set來添加和刪除數據,使得數據的變化能夠及時地反映在視圖中。

三、uniapp$set的底層實現原理

uniapp.$set背後的原理非常簡單,它主要是利用Vue.js的Object.defineProperty方法來監測數據的變化。當我們利用uniapp.$set函數來改變數據時,Vue.js會自動調用Object.defineProperty方法來監測數據變化,從而觸發視圖更新。

下面我們來看一下uniapp.$set背後的實現原理:

export function $set(target: any, key: string | number, val: any): any {
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key)
    // 利用 splice 方法來觸發視圖更新
    target.splice(key, 1, val)
    return val
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }
  const ob = (target: any).__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    // 防止修改 Vue 實例或其 $data 對象
    return val
  }
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

從上面的代碼中可以看出,如果target是一個數組,那麼之所以使用splice方法來觸發視圖更新,是因為Vue.js能夠監聽到數組下標的變化,而使用splice方法能夠觸發數組下標的變化。如果target是一個對象且key是該對象的已有屬性,那麼直接將val賦值給該屬性即可。如果key是該對象的新屬性,那麼使用defineReactive函數來監測這個新屬性的變化。

四、uniapp$set的優缺點

uniapp.$set函數的主要優點在於它能夠監聽對象屬性和數組下標的變化,從而讓Vue.js能夠及時地更新視圖。同時,它還可以監聽新屬性的添加和刪除,這樣我們就不必在Vue.js初始化的時候就把所有的屬性都定義好。

不過,uniapp.$set函數也有它的缺點。比如,調用該函數的代價比直接操作數據高得多。因為我們本來應該直接操作數據的,但是現在卻要使用該函數來操作數據,這樣會造成額外的開銷,從而降低程序的執行效率。

五、總結

本文詳細講解了uniapp.$set函數的使用方法、使用場景、底層實現原理和優缺點。只有深入了解uniapp.$set函數,我們才能更好地使用它,從而讓我們的程序更加高效、穩定和易於維護。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:25
下一篇 2024-12-12 13:25

相關推薦

  • Python中set函數的作用

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

    編程 2025-04-29
  • Python Set元素用法介紹

    Set是Python編程語言中擁有一系列獨特屬性及特點的數據類型之一。它可以存儲無序且唯一的數據元素,這使得Set在數據處理中非常有用。Set能夠進行交、並、差集等操作,也可以用於…

    編程 2025-04-29
  • Python set去重保留原順序

    當一個列表中出現重複的元素時,為了去除這些重複元素可以使用Python提供的集合(set)數據結構,集合可以去除元素的重複出現。然而,這樣會導致原有的元素順序混亂,這時,需要使用一…

    編程 2025-04-27
  • uniapp分頁第二次請求用法介紹

    本文將從多個方面對uniapp分頁第二次請求進行詳細闡述,並給出對應的代碼示例。 一、請求參數的構造 在進行分頁請求時,需要傳遞的參數體包含當前頁碼以及每頁顯示的數據量。對於第二次…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25

發表回復

登錄後才能評論