VUE 動態給對象增加屬性,並觸發視圖更新。


在開發過程中,我們時常會遇到這樣一種情況:當vue的data里邊聲明或者已經賦值過的對象或者數組(數組里邊的值是對象)時,向對象中添加新的屬性,如果更新此屬性的值,是不會更新視圖的。

根據官方文檔定義:如果在實例創建之后添加新的屬性到實例上,它不會觸發視圖更新。

Vue 不允許在已經創建的實例上動態添加新的根級響應式屬性 (root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法將響應屬性添加到嵌套的對象上。

我們編寫如下代碼測試給一個對象動態添加屬性:

<div id="app">
    <input v-model="form.amount" /> 
    <input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
    el: "#app",
    data: {
        i:0,
        form:{}
    },
    methods:{
        demoSet(){
            this.form.amount=this.i++;
            //this.$set(this.form,"amount",this.i++);
        }
    }
   });
</script>

這種方式可以給form增加一個屬性,但是不會界面不會響應更新。

正確的做法:

<div id="app">
    <input v-model="form.amount" /> 
    <input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
    el: "#app",
    data: {
        i:0,
        form:{}
    },
    methods:{
        demoSet(){
            this.$set(this.form,"amount",this.i++);
        }
    }
   });
</script>

這樣就可以給對象添加amount 屬性了。

這個有什么應用場景呢,比如 data.form 屬性很多,其中大部分是不需要要的,這時候,可以使用這種方法實現動態添加需要的屬性。

需要注意的是,這種方式是不能給根數據添加屬性的,比如:

<div id="app">
    <input v-model="name" /> 
    <input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
    el: "#app",
    data: {
        
    },
    methods:{
        demoSet(){
            this.$set(this,"name","ray");
        }
    }
   });
</script>

這種方式給data 增加一個 name 屬性是無效的。

 


免責聲明!

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



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