vue中 this.$set的使用詳解
vue中 this.$set的使用
背景:在我寫前端項目的時候,后端給我們的一個json對象,并且我已經渲染在頁面上了。但是由于我自己的需求,想往返回的對象里面添加一個字段,于是我用push一個字段進去,添加是添加進去了,但是頁面渲染卻沒有變化。后來才意識到不是響應式的。如果我們要讓這個新字段是響應式的,就要使用到this.$set來注入數(shù)據(jù)
當vue的data里邊聲明或者已經賦值過的對象或者數(shù)組(數(shù)組里邊的值是對象)時,向對象中添加新的屬性,如果更新此屬性的值,是不會更新視圖的。
使用
this.$set( target, key, value)
target:表示數(shù)據(jù)源,即是你要操作的數(shù)組或者對象
key:要操作的的字段
value:更改的數(shù)據(jù)
來個小案例:
給一個對象添加一個年齡屬性并且讓它可以響應式的進行改變

<template>
<div class="text">
<p>{{list}}</p>
<button @click="add">age++</button>
</div>
</template>
<script>
export default {
data(){
return {
list:{ name: "張三"}
}
},
methods: {
add(){
if(!this.list.age){ // 如果沒有age屬性就給它添加一個age屬性
this.list.age=18
}else{
this.list.age++
}
console.log(this.list)
}
}
}
</script>
當我們沒有使用this.$set去添加對象屬性的時候,效果:
數(shù)據(jù)確實已經添加進去了,但是頁面并沒有響應式的渲染age屬性。

當我們使用this.$set(this.list,‘age',18)去添加一個屬性之后。效果:

我們能看見添加的數(shù)據(jù)是響應式的。
為什么能夠響應式?
仔細觀察一下,使用了this.$set 多了get age和set age方法,這正是能夠響應式的原因

分析
Vue的響應式原理為 JavaScript 對象傳入 Vue 實例作為 data 選項,Vue 將遍歷此對象所有的 property,并使用 Object.defineProperty 把這些 property 全部轉為 getter/setter。這些 getter/setter 對用戶來說是不可見的,但是在內部它們讓 Vue 能夠追蹤依賴,在 property 被訪問和修改時通知變更。這里需要注意的是不同瀏覽器在控制臺打印數(shù)據(jù)對象時對 getter/setter 的格式化并不同,下圖來自官方文檔。

總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Vue如何使用Promise.all()方法并行執(zhí)行多個請求
在Vue中,可以使用Promise.all()方法并行執(zhí)行多個異步請求,當所有請求都成功返回時,Promise.all()將返回一個包含所有請求結果的數(shù)組,如果其中任何一個請求失敗,則會觸發(fā)catch()方法并返回錯誤信息,這種方式可以顯著提高程序的性能和響應速度2025-01-01
Vue + Webpack + Vue-loader學習教程之相關配置篇
這篇文章主要介紹了關于Vue + Webpack + Vue-loader的相關配置篇,文中通過示例代碼介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
vue計算屬性無法監(jiān)聽到數(shù)組內部變化的解決方案
今天小編就為大家分享一篇vue計算屬性無法監(jiān)聽到數(shù)組內部變化的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

