溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue的vue.$set()方法源碼案例詳解

發(fā)布時(shí)間:2021-08-30 20:40:36 來源:億速云 閱讀:145 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Vue的vue.$set()方法源碼案例詳解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Vue的vue.$set()方法源碼案例詳解”吧!

在使用vue開發(fā)項(xiàng)目的過程中,經(jīng)常會(huì)遇到這樣的問題:當(dāng)vue的data里邊聲明或者已經(jīng)賦值過的對象或者數(shù)組(數(shù)組里邊的值是對象)時(shí),向?qū)ο笾刑砑有碌膶傩裕绻麓藢傩缘闹?,是不?huì)更新視圖的。

這是因?yàn)樾录尤氲膶傩圆皇琼憫?yīng)式的,因此不會(huì)觸發(fā)視圖的更新,通常使用靜態(tài)方法Vue.set()或者實(shí)例方法this.$set()解決 ,使用方式:

對象:this.$set(target,key,  value)

數(shù)組:this.$set(target,index,  value)

但不管是靜態(tài)方法Vue.set()還是實(shí)例方法this.$set(),他們底層的實(shí)現(xiàn)邏輯是一樣的,實(shí)現(xiàn)邏輯如下:

/**
 * Set a property on an object. Adds the new property and
 * triggers change notification if the property doesn't
 * already exist.
 */
export function set (target: Array<any> | Object, key: any, val: any): any {
  // 首先判斷如果傳入的目標(biāo)對象是undefined, null, primitive(原始值),或拋出警告
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  // 判斷目標(biāo)對象target是數(shù)組,并且key是合法的索引
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    // 取目標(biāo)數(shù)組的length值和key中較大的值作為target的length屬性
    target.length = Math.max(target.length, key)
    // 通過splice對key位置的元素進(jìn)行替換
    target.splice(key, 1, val)
    return val
  }
  // 如果key在目標(biāo)對象中已經(jīng)存在,則直接賦值
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }
  // 獲取target中的observer對象
  const ob = (target: any).__ob__
  // 如果target是vue實(shí)例或者$data直接返回
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' && warn(
      'Avoid adding reactive properties to a Vue instance or its root $data ' +
      'at runtime - declare it upfront in the data option.'
    )
    return val
  }
  // 如果ob不存在,說明target不是響應(yīng)式對象,直接賦值,不觸發(fā)視圖更新
  if (!ob) {
    target[key] = val
    return val
  }
  // 如果ob存在,把key設(shè)置為響應(yīng)式屬性
  defineReactive(ob.value, key, val)
  // 發(fā)送通知,觸發(fā)視圖更新
  ob.dep.notify()
  return val
}

以上是vue 中set方法的源碼,在這里需要特別注意的是,在對數(shù)組進(jìn)行處理時(shí),所用的splice方法并不是數(shù)組本身的方法,而是在vue中封裝的具有響應(yīng)式的數(shù)組方法。

到此,相信大家對“Vue的vue.$set()方法源碼案例詳解”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

vue
AI