vue的$set使用【數組與對象的賦值視圖不更新情況】


由於 Vue 會在初始化實例時進行雙向數據綁定,使用Object.defineProperty()對屬性遍歷添加 getter/setter 方法,所以 屬性必須在 data 對象上存在時才能進行上述過程 ,這樣才能讓它是響應的。如果要給對象添加新的屬性,此時新屬性沒有進行過上述過程,不是響應式的,所以會出想數據變化,頁面不變的情況。此時需要用到$set。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vue $set</title>
<script src="https://static.runoob.com/assets/vue/1.0.11/vue.min.js"></script>
</head>
<body>
<div id="app">
  姓名:{{ name }}<br>
    年齡:{{age}}<br>
    性別:{{sex}}<br>
    說明:{{info.content}}
</div>
<!-- JavaScript 代碼需要放在尾部(指定的HTML元素之后) -->
<script>
var data = {
    name: "簡書",
    age: '3',
    info: {
        content: 'my name is test'
    }
}    
var key = 'content';
var vm = new Vue({
    el:'#app',
    data: data,
    ready: function(){
        //Vue.set(data,'sex', '男')
        //this.$set('info.'+key, 'what is this?');
    }
});
<!--如果直接新增sex屬性,就會出現下圖情況,所以頁面上{{sex}}是沒有數據的--> 
data.sex
= ''</script> </body>

在age及name都有get和set方法,但是在sex里面並沒有這兩個方法,因此,設置了sex值后vue並不會自動更新視圖;

 

 數組與對象都會有以上問題解決方法:vue 的$set方法

1、數組

this.$set(Array, index, newValue)
<--
    由於 JavaScript 的限制,Vue 不能檢測以下變動的數組:
    當你利用索引直接設置一個項時,例如:vm.items[indexOfItem] =                     
    newValue
    解決:用$set方法
    當你修改數組的長度時,例如:vm.items.length = newLength
    解決:vm.items.splice(newLength) 
--> 

2、對象

this.$set(Object, key, value)
<--
有時你想向已有對象上添加一些屬性,例如使用 Object.assign() 或 _.extend() 方法來添加屬性。
但是,添加到對象上的新屬性不會觸發更新。
在這種情況下可以創建一個新的對象,讓它包含原對象的屬性和新的屬性:

this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })   或者上面的$set方法
-->

 

轉自鏈接:https://www.jianshu.com/p/70b2e2e0aa11


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM