成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有使用過vm.$set嗎,原理是什么?

開發(fā) 前端
vm.$set? 方法在 Vue 中用于動(dòng)態(tài)添加響應(yīng)式屬性,確保新屬性能夠被 Vue 的響應(yīng)式系統(tǒng)監(jiān)測(cè)到。它通過 Object.defineProperty 將新屬性定義為響應(yīng)式屬性,并觸發(fā)依賴更新,確保視圖能夠正確更新。

vm.$set 是 Vue.js 提供的一個(gè)方法,用于在 Vue 實(shí)例中動(dòng)態(tài)添加響應(yīng)式屬性。它的主要作用是確保新添加的屬性能夠被 Vue 的響應(yīng)式系統(tǒng)監(jiān)測(cè)到,從而觸發(fā)視圖的更新。

使用示例

假設(shè)我們有一個(gè) Vue 實(shí)例

var vm = new Vue({
  data: {
    user: {
      name: 'Alice'
    }
  }
});

我們希望在 user 對(duì)象中添加一個(gè)新的屬性 age。直接添加不會(huì)觸發(fā)視圖更新

vm.user.age = 25; // 直接添加不會(huì)觸發(fā)視圖更新

為了確保新添加的屬性是響應(yīng)式的,可以使用 vm.$set

vm.$set(vm.user, 'age', 25);

原理

Vue 的響應(yīng)式系統(tǒng)是基于 Object.defineProperty 實(shí)現(xiàn)的。當(dāng)一個(gè)對(duì)象被添加到 Vue 實(shí)例的 data 中時(shí),Vue 會(huì)遞歸地遍歷該對(duì)象的所有屬性,并使用 Object.defineProperty 將這些屬性轉(zhuǎn)換為 getter 和 setter,從而實(shí)現(xiàn)響應(yīng)式。然而,直接添加的新屬性并沒有通過這種方式定義,因此 Vue 無法檢測(cè)到這些新屬性的變化。vm.$set 方法內(nèi)部使用了 Vue 的 set 方法,它會(huì)確保新添加的屬性也能通過 Object.defineProperty 轉(zhuǎn)換為響應(yīng)式屬性。

vm.$set 的實(shí)現(xiàn)

Vue 源碼中 set 方法的實(shí)現(xiàn)(Vue 2.x)大致如下:

function set(target, key, val) {
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key);
    target.splice(key, 1, val);
    return val;
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val;
  }
  const ob = target.__ob__;
  if (!ob) {
    target[key] = val;
    return val;
  }
  defineReactive(ob.value, key, val);
  ob.dep.notify();
  return val;
}
function defineReactive(obj, key, val) {
  const dep = new Dep();
  let childOb = observe(val);
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      const value = val;
      if (Dep.target) {
        dep.depend();
        if (childOb) {
          childOb.dep.depend();
        }
      }
      return value;
    },
    set: function reactiveSetter(newVal) {
      const value = val;
      if (newVal === value || (newVal !== newVal && value !== value)) {
        return;
      }
      val = newVal;
      childOb = observe(newVal);
      dep.notify();
    }
  });
}

總結(jié)

vm.$set 方法在 Vue 中用于動(dòng)態(tài)添加響應(yīng)式屬性,確保新屬性能夠被 Vue 的響應(yīng)式系統(tǒng)監(jiān)測(cè)到。它通過 Object.defineProperty 將新屬性定義為響應(yīng)式屬性,并觸發(fā)依賴更新,確保視圖能夠正確更新。

使用工具學(xué)會(huì)使用只是第一步,掌握原理并能夠通過原理解決問題才是關(guān)鍵,在平時(shí)的開發(fā)中,使用時(shí)多數(shù),然而在遇到復(fù)雜問題或者優(yōu)化時(shí)候掌握原理會(huì)提高開發(fā)效率。

責(zé)任編輯:武曉燕 來源: 海燕技術(shù)棧
相關(guān)推薦

2022-07-12 12:05:22

JavaSemaphore

2025-02-13 09:37:26

2025-01-15 13:30:48

FeignHTTPJava

2023-11-05 10:52:54

DNS服務(wù)器瀏覽器

2024-11-25 12:20:00

Hystrix微服務(wù)架構(gòu)

2021-09-10 06:50:03

HashMapHash方法

2025-04-15 08:00:00

Java開發(fā)服務(wù)網(wǎng)格

2023-09-13 09:20:00

日志配置Spring

2021-08-26 21:55:38

DPU架構(gòu)數(shù)據(jù)

2009-12-07 16:46:56

Windows SDK

2024-01-11 08:53:58

2021-09-27 08:02:17

CDN加速網(wǎng)站網(wǎng)絡(luò)

2021-02-02 18:02:09

java對(duì)象數(shù)據(jù)

2021-02-08 21:07:47

JavaCAS機(jī)制

2021-07-29 11:46:27

NAS存儲(chǔ)NAS服務(wù)器

2024-08-12 12:32:53

Axios機(jī)制網(wǎng)絡(luò)

2025-03-27 04:00:00

2021-05-09 09:30:13

Docker操作系統(tǒng)容器

2021-06-30 06:28:07

人臉識(shí)別AI人工智能

2024-08-27 08:55:32

Axios底層網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品日韩欧美一区二区 | 成人视屏在线观看 | 蜜桃视频在线观看免费视频网站www | 欧美午夜精品久久久久久浪潮 | 日韩精品一二三 | 国产精品久久久久久av公交车 | 国产成人精品一区二区 | 天堂久久一区 | 理论片免费在线观看 | 国产精品久久久久久久久 | 国产国产精品 | 国产美女在线播放 | 日韩中文字幕免费在线 | 成人视屏在线观看 | 91精品国产日韩91久久久久久 | 亚洲一区成人 | 亚洲国产成人精品久久 | 可以在线观看av的网站 | 午夜欧美 | a级毛片毛片免费观看久潮喷 | 亚洲情侣视频 | 韩日免费视频 | 美女毛片免费看 | 国产成人一区二区三区 | 日韩1区2区 | 亚洲精品乱码久久久久久蜜桃91 | 一区二区三区在线 | 超碰97免费 | 无码一区二区三区视频 | 欧美午夜视频 | 一区二区三区免费 | 热99视频| 亚洲一区二区av | 国产精品一区二区三区在线 | 中文日韩在线视频 | 国产欧美精品一区二区色综合朱莉 | 91欧美精品成人综合在线观看 | 在线观看成年人视频 | 九九看片| 日韩午夜网站 | 国产午夜久久久 |