欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Vue的$set怎么實(shí)現(xiàn)

這篇文章主要講解了“Vue的$set怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Vue的$set怎么實(shí)現(xiàn)”吧!

成都創(chuàng)新互聯(lián)專業(yè)提供成都主機(jī)托管四川主機(jī)托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價格,機(jī)房位于中國電信/網(wǎng)通/移動機(jī)房,成都IDC機(jī)房托管服務(wù)有保障!

應(yīng)用場景

 let dataArr = ["item1"];
 let dataObject = {
      name: "ccs"
    };

    dataArr[2] = "item2";
    dataObject.age = 22;
    響應(yīng)失敗,頁面沒有顯示更新新增的數(shù)據(jù)

    this.$set(this.dataArr,2,'item2')
    this.$set(this.dataObject,'age',22)
    響應(yīng)成功,頁面顯示更新新增的數(shù)據(jù)

set實(shí)現(xiàn)

接下來我們看一下$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的目標(biāo)是否是undefined基本類型如果是undefined基本類型就報錯,
因?yàn)橛脩舨粦?yīng)該往undefined和基本類型中set東西,
然后又判斷了目標(biāo)是否是數(shù)組與key是不是合法的index,合法的index是指值為大于等于0的整數(shù),
如果兩個條件都成立就對目標(biāo)數(shù)組調(diào)用splice方法插入或者修改數(shù)組,
這里的splice不是普通的splice,是王維詩里的splice,是被vue代理重寫過的splice

數(shù)組實(shí)現(xiàn)響應(yīng)

$set實(shí)現(xiàn)數(shù)組修改響應(yīng)的方式是代理重寫的數(shù)組的一部分方法,接下來我們看一下具體實(shí)現(xiàn)

const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]
function def(obj, key, val, enumerable) {
    Object.defineProperty(obj, key, {
        value: val,
        enumerable: !!enumerable,
        writable: true,
        configurable: true
    });
}
methodsToPatch.forEach(function (method) {
  const original = arrayProto[method]
  def(arrayMethods, method, function mutator (...args) {
    const result = original.apply(this, args)
    const ob = this.__ob__
    let inserted
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted)
    ob.dep.notify()
    return result
  })
})

vue中代理重寫的不只是splice,有push、pop、shift、unshift、splice、sort、reverse這七個方法, 首先執(zhí)行了const result = original.apply(this, args)執(zhí)行原本數(shù)組的方法并獲取它的值,接下來判斷如果是往數(shù)組中添加值就將新添加的值也實(shí)現(xiàn)響應(yīng)式,
最后一步拿到這個數(shù)組的_ob_對象_ob_里的dep進(jìn)行派發(fā)更新。
想深入了解vue的響應(yīng)式可以查閱往期文章
面試官問你Vue2的響應(yīng)式原理,你怎么答? - 掘金 (juejin.cn)

對象實(shí)現(xiàn)響應(yīng)

$set中下半部分的邏輯就是用來處理對象響應(yīng)的,我們接著往下看

  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val;
  }
  const ob = (target: any).__ob__;
  if (!ob) {
    target[key] = val;
    return val;
  }
  defineReactive(ob.value, key, val);
  ob.dep.notify();
  return val;

首先判斷了屬性如果在目標(biāo)對象中直接return結(jié)束邏輯,
因?yàn)関ue只有添加目標(biāo)對象中原本沒有的屬性時才會失去響應(yīng)
例如 let obj={}  obj.name='ccs',
vue在初始化的時候會將data里的所有屬性都變成響應(yīng)式,如果的值是對象或者數(shù)組則會new一個Observer實(shí)例儲存在__ob__,想深入了解vue的響應(yīng)式可以查閱往期文章
面試官問你Vue2的響應(yīng)式原理,你怎么答? - 掘金 (juejin.cn)
拿到這個對象的_ob_進(jìn)行判斷,如果不存在就說明是未經(jīng)過vue初始化的普通對象而不是響應(yīng)式對象否則就手動通過defineReactive為屬性添加get方法與set方法實(shí)現(xiàn)響應(yīng),
然后手動調(diào)用dep里的notify()發(fā)布更新。

感謝各位的閱讀,以上就是“Vue的$set怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Vue的$set怎么實(shí)現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:Vue的$set怎么實(shí)現(xiàn)
分享網(wǎng)址:http://aaarwkj.com/article26/pdpjjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、App設(shè)計(jì)、小程序開發(fā)、移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
日本一区二区手机在线| 国产丝袜在线福利观看| 久久亚洲精品综合一区| 色噜噜男人的天堂av| 国产亚洲无线码一区二区| 国产精品自产拍在线网站| 日本一区二区三区福利视频 | 亚洲欧美日韩性生活视频| 九七青青草视频在线观看| 精品国产女同一区二区| 日韩不卡高清免费在线视频| 九九视频在线精品免费观看| 久久91亚洲精品中文字幕| 精品人妻日韩中文字幕| 国产高清视频在线观看流白浆| 日本一区二区电影大全| 国产成人免费视频一区| 亚洲成人高清av在线| 日韩人妻一区二区三区蜜桃视频密| 日韩精品一二区电影| 久久中文字幕av一区| 成人爱爱视频在线免费观看| 女人被爽到高潮呻吟免费看| 亚洲日本一区二区高清在线| 亚洲国产欧美日韩久久| 伊人丁香六月日日操操| 久久精品国产亚洲av高清大结局| 狠狠躁夜夜躁人人爽蜜桃| 天天操天天干夜夜骑| 欧美在线日韩一区二区| 欧美日韩国产成人激情| 日本待黄大片一区二区| 国产内射一级一片高清视频观看| 国产成人亚洲精品在线看| 久久99精品久久久国产| 国产日韩欧美另类综合| 日韩电影网国产精品| 中文字幕人妻熟女人妻| 亚洲欧美日韩国产在线一区| 高清偷自拍亚洲精品三区| 日韩精品在线第一视频|