不知道大家有沒有遇到過這個問題,當我們給data里邊聲明或者已經賦值過的對象或者數組,添加新的屬性時,如果更新此屬性的值是不會動態更新視圖的。
$set
看以下實例:
我們開始給drug_list追加一個新的屬性‘edit_select’,默認所有的編輯狀態為false,當我們點擊的時候,把當前點擊的編輯狀態置為true
作者:_conquer_
鏈接:https://www.jianshu.com/p/c457cfe7d713
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
<div id="box"> <div v-for="drug_item in drug_list" @click="choose(drug_item)"> <a :class="{pressed:drug_item.edit_select}"></a> <span>{{drug_item.drug_common_name}}{{drug_item.edit_select}}</span> </div> </div> <script> var vm = new Vue({ el:'#box', data:{ drug_list:[ {drug_common_name: "辛伐他汀片",drug_count: "1"}, {drug_common_name: "喉疾靈片",drug_count: "2"}, {drug_common_name: "樂脈膠囊",drug_count: "3"}, ] }, created:function(){ this.setData(); }, methods: { setData:function(){ for(var i=0;i<this.drug_list.length;i++){ this.drug_list[i]['edit_select']=false; } }, choose:function(item){ item.edit_select=true; console.log(item) }, } }) </script>
我們打印一下點擊之后的數據會發現數據已經改了

QQ截圖20181115175134.png
但是我們看一下頁面效果,會發現並沒有添加上class,把數據在頁面上打印一下會發現,頁面上面的‘edit_select’並沒有動態更改

QQ截圖20181115175352.png
這是為什么呢?
仔細閱讀官方文檔,我們會發現:
Vue 不允許在已經創建的實例上動態添加新的根級響應式屬性, Vue 無法探測普通的新增屬性
怎么辦呢?
Vue.set( target, key, value )
- 參數:
{Object | Array} target
{string | number} key
{any} value - 返回值:設置的值。
我們只需要把下面的改一下就可以了
for(var i=0;i<this.drug_list.length;i++){ //this.drug_list[i]['edit_select']=false; that.$set(this.drug_list[i], 'edit_check', false); }