最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中Vue.set()的使用以及對其進(jìn)行深入解析

 更新時間:2023年01月04日 09:31:46   作者:天命愛心職責(zé)~  
vue不允許在已經(jīng)創(chuàng)建的實例上動態(tài)添加新的根級響應(yīng)式屬性,不過可以使用Vue.set()方法將響應(yīng)式屬性添加到嵌套的對象上,下面這篇文章主要給大家介紹了關(guān)于vue中Vue.set()的使用以及對其進(jìn)行深入解析的相關(guān)資料,需要的朋友可以參考下

Vue.set()使用

vue 在實例上添加新的屬性的時候,該屬性,并不是響應(yīng)式的。同樣刪除某一屬性的時候,也不會實時渲染到頁面上。

比如:

 <p> 年齡:{{obj.age? obj.age: "無"}}</p>

        ···········      

 data() {

            return {        

                obj:{ name:"Lena", id:1 },

            }

          }

頁面上 顯示的是  年齡:無   現(xiàn)在需要添加一個響應(yīng)式的屬性 age 。

<template>
<div class="app">
      <ul>
        <li> 年齡:{{obj.age? obj.age: "無"}}</li>
      </ul>
      <button @click="add()">添加年齡屬性</button>
      <button @click="show()">打印</button>
</div>
</template>
 
<script>
import Vue from 'vue'
export default {
  component:{},
  data() {
    return {
        obj:{ name:"Lena", id:1 },
    }
  },
  methods: {
    add(){
      this.obj.age= 20
    },
    show(){
      console.log('obj',this.obj)
    }
  }
}
</script>

效果:

通過 this.obj.age= 20 ,控制臺打印已經(jīng)有了該屬性,并沒有渲染到頁面上。 可見,這種方式添加的屬性 age 并不是響應(yīng)式的。

使用Vue.set() ,更改add()方法:

add(){
      Vue.set(this.obj,'age', '20')
    },

效果:

因為vue不能檢測到對象屬性的添加或者刪除,只有在data對象上存在的屬性是響應(yīng)式的,所以要使用Vue.set()方法將響應(yīng)式屬性添加到對象上。同樣的道理,刪除對象 Vue.delete也是如此。

Vue.delete()的使用

<template>
<div class="app">
      <ul>
        <li> 年齡:{{obj.age? obj.age: "無"}}</li>
      </ul>
      <button @click="add()">添加年齡屬性</button>
      <button @click="del()">刪除年齡屬性</button>
      <button @click="show()">打印</button>
</div>
</template>
<script>
import Vue from 'vue'
export default {
  component:{
 
  },
  data() {
    return {
        obj:{ name:"Lena", id:1 },
    }
  },
  methods: {
    add(){
      Vue.set(this.obj,'age', '20')
    },
    del(){
      Vue.delete(this.obj,'age')
    },
    show(){
      console.log('obj',this.obj)
    }
  }
}
</script>

效果:

del() 方法如果是下面兩種,同樣不是響應(yīng)式的。

del(){

      delete this.obj.age

    },

或者:

del(){

      this.obj = { name:"Lena", id:1 }

    },

Vue.set()方法原理解析

我們找到封裝set方法的地方:.........\node_modules\vue\src\core\observer\index.js

 找到封裝的set方法:

export 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
}

對象調(diào)用:Vue.set( target ,'age', 20 ) 

數(shù)組調(diào)用Vue.set( array , 0,  20 )  //數(shù)組對象,索引,值

首先是判斷是否是開發(fā)環(huán)境并且 對象是否被定義isUndef(target)或者是否是基礎(chǔ)類型isPrimitive(target),否則會報錯:

`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`

if (process.env.NODE_ENV !== 'production' &&

    (isUndef(target) || isPrimitive(target))

  )

如果是數(shù)組的話,調(diào)用重寫的splice()方法,可以更新視圖。

isValidArrayIndex(key)方法用來驗證是否是一個有效的數(shù)組索引, 其實就是驗證是否是一個非無窮大的正整數(shù)。

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
? }

 如果是Vue實例,或者是根數(shù)據(jù)data的時候,就會報錯。

如果本身就不是響應(yīng)式的,只需要直接賦值即可。

const ob = (target: any).__ob__
  //如果是Vue實例,或者是根數(shù)據(jù)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
  }
 
  //如果本身就不是響應(yīng)式的,只需要直接賦值即可。
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val

排除各種不合適的,最后給當(dāng)前對象定義一個屬性:defineReactive(ob.value, key, val) 相當(dāng)于用了 Object.defineProperty 重新定義了一下。

最后,手動通知視圖更新:ob.dep.notify()

總結(jié)

這個 set方法,對于數(shù)組來說,調(diào)用的就是splice,對于對象來說,使用的就是defineReactive,再添加了一個手動的視圖更新。這就是set的原理。

到此這篇關(guān)于vue中Vue.set()的使用以及對其進(jìn)行深入解析的文章就介紹到這了,更多相關(guān)vue Vue.set()的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實現(xiàn)鼠標(biāo)懸浮框效果

    vue實現(xiàn)鼠標(biāo)懸浮框效果

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)鼠標(biāo)懸浮框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 對vuejs的v-for遍歷、v-bind動態(tài)改變值、v-if進(jìn)行判斷的實例講解

    對vuejs的v-for遍歷、v-bind動態(tài)改變值、v-if進(jìn)行判斷的實例講解

    今天小編就為大家分享一篇對vuejs的v-for遍歷、v-bind動態(tài)改變值、v-if進(jìn)行判斷的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vuecli項目構(gòu)建SSR服務(wù)端渲染的實現(xiàn)

    vuecli項目構(gòu)建SSR服務(wù)端渲染的實現(xiàn)

    這篇文章主要介紹了vuecli項目構(gòu)建SSR服務(wù)端渲染的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解vue路由篇(動態(tài)路由、路由嵌套)

    詳解vue路由篇(動態(tài)路由、路由嵌套)

    這篇文章主要介紹了詳解vue路由篇(動態(tài)路由、路由嵌套),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 在Vue中使用防抖與節(jié)流,及this指向的問題

    在Vue中使用防抖與節(jié)流,及this指向的問題

    這篇文章主要介紹了在Vue中使用防抖與節(jié)流,及this指向的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Vue3中從一個頁面(index)傳輸數(shù)值到另一個頁面(form)的方法詳解

    Vue3中從一個頁面(index)傳輸數(shù)值到另一個頁面(form)的方法詳解

    在 Vue 3 開發(fā)中,經(jīng)常需要在不同組件或頁面之間傳遞數(shù)據(jù),例如從 index 頁面獲取某個數(shù)值(如 cntr、tradeId)后,將其傳輸?shù)?nbsp;form 頁面進(jìn)行填寫或編輯,本文將介紹幾種常見的數(shù)據(jù)傳輸方法,并為每種方法提供一個小的 Demo 代碼示例,需要的朋友可以參考下
    2025-02-02
  • 深入淺出vue圖片路徑的實現(xiàn)

    深入淺出vue圖片路徑的實現(xiàn)

    這篇文章主要介紹了深入淺出vue圖片路徑的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Vue Router動態(tài)路由使用方法總結(jié)

    Vue Router動態(tài)路由使用方法總結(jié)

    這篇文章主要介紹了Vue Router動態(tài)路由使用方法總結(jié),需要的朋友可以參考下
    2023-10-10
  • vue3如何實現(xiàn)?6位支付密碼輸入框

    vue3如何實現(xiàn)?6位支付密碼輸入框

    微信、支付寶支付密碼時的密碼輸入框大家都很熟悉,本文主要介紹了vue3如何實現(xiàn)?6位支付密碼輸入框,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue模塊移動組件的實現(xiàn)示例

    vue模塊移動組件的實現(xiàn)示例

    這篇文章主要介紹了vue模塊移動組件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05

最新評論

武汉市| 准格尔旗| 宁德市| 松桃| 陆丰市| 苏尼特左旗| 台中市| 喀什市| 锡林郭勒盟| 张家口市| 苍梧县| 西和县| 南江县| 遵义县| 静乐县| 黄山市| 肥东县| 五河县| 类乌齐县| 华容县| 于都县| 敦化市| 青浦区| 天镇县| 阿拉尔市| 永平县| 凤阳县| 桃源县| 兰考县| 辽阳市| 阜新| 潢川县| 钟山县| 兰考县| 平顶山市| 隆林| 封丘县| 都昌县| 乌恰县| 微博| 武邑县|