中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Vue.set()和this.$set()的區別是什么

發布時間:2021-06-02 16:01:01 來源:億速云 閱讀:328 作者:Leah 欄目:開發技術

Vue.set()和this.$set()的區別是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

data () {
  return {
    student: {
      name: '',
      sex: ''
    }
  }
}
mounted () { // ——鉤子函數,實例掛載之后
  this.student.age = 24
}

受 ES5 的限制,Vue.js 不能檢測到對象屬性的添加或刪除。因為 Vue.js 在初始化實例時將屬性轉為 getter/setter,所以屬性必須在 data 對象上才能讓 Vue.js 轉換它,才能讓它是響應的。

正確寫法:this.$set(this.data,”key”,value')

mounted () {
  this.$set(this.student,"age", 24)
}

:: Vue 不允許動態添加根級響應式屬性。

例如:

const app = new Vue({
  data: {
    a: 1
  }
  // render: h => h(Suduko)
}).$mount('#app1')

Vue.set(app.data, 'b', 2)

Vue.set()和this.$set()的區別是什么

只可以使用 Vue.set(object, propertyName, value) 方法向嵌套對象添加響應式屬性,例如

var vm=new Vue({
    el:'#test',
    data:{
        //data中已經存在info根屬性
        info:{
            name:'小明';
        }
    }
});
//給info添加一個性別屬性
Vue.set(vm.info,'sex','男');

Vue.set()和this.$set()實現原理

我們先來看看Vue.set()的源碼:

import { set } from '../observer/index'

...
Vue.set = set
...

再來看看this.$set()的源碼:

import { set } from '../observer/index'

...
Vue.prototype.$set = set
...

結果我們發現Vue.set()和this.$set()這兩個api的實現原理基本一模一樣,都是使用了set函數。set函數是從 ../observer/index 文件中導出的,區別在于Vue.set()是將set函數綁定在Vue構造函數上,this.$set()是將set函數綁定在Vue原型上。

function set (target: Array<any> | Object, key: any, val: any): any {
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  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: any).__ob__
  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
  }
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

我們發現set函數接收三個參數分別為 target、key、val,其中target的值為數組或者對象,這正好和官網給出的調用Vue.set()方法時傳入的參數參數對應上。

Vue.set()和this.$set()的區別是什么

看完上述內容,你們掌握Vue.set()和this.$set()的區別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武穴市| 泰来县| 当涂县| 东光县| 即墨市| 寿宁县| 新龙县| 济南市| 正镶白旗| 元江| 即墨市| 温宿县| 清丰县| 读书| 武陟县| 原平市| 宁强县| 肥城市| 青海省| 睢宁县| 登封市| 马龙县| 金塔县| 伊金霍洛旗| 星子县| 嵊泗县| 新沂市| 海安县| 鞍山市| 甘谷县| 福泉市| 大新县| 商河县| 龙游县| 乌审旗| 托克逊县| 五家渠市| 阳朔县| 东乌珠穆沁旗| 汶上县| 玛曲县|