Vue.$set的使用場景


有這樣一個需求,用戶可以增加多個輸入框可以編輯:

 

 
 

 

實現的思路很簡單,點擊增加的時候,往一個數組里面push一條數據即可:

<template> <div> <div v-for="(item,k) in prodForm.seqNos" :key="k"> <input type="text" v-model="item.seqNo" /> </div> <button @click="add">增加</button> </div> </template> <script> export default { name: "addInput", mounted(){ this.prodForm = this.basicInfo //初始化 this.prodForm.seqNos = [] //因basicInfo沒有seqNos,因此重新添加 console.log(this.prodForm) }, data(){ return { prodForm:{ id:'', seqNos:[], }, basicInfo:{ id:1 } } }, methods:{ add(){ this.prodForm.seqNos.push({seqNo:''}) } }, } </script> <style scoped> .btn{ width:100px; margin:10px; } </style> 

在mounted有一個初始化賦值操作,而basicInfo里面並沒有seqNos這個數組,當賦值完成后,我需要重新添加回來,這樣就有問題了,你點擊增加的按鈕無法生效,為啥呢?
根據官方文檔定義:
如果在實例創建之后添加新的屬性到實例上,它不會觸發視圖更新。
也就是說,默認vue會遍歷data里面的所有屬性,並使用Object.defineProperty把這些屬性全部轉為 getter/setter。
我們通過打印prodForm變量,發現seqNos這個數組並未增加getter和setter,也就是這個數組並沒被監聽起來:

 

 
 

 

怎么辦呢?$set就派上用場了:

Vue.$set(object, key, value) 

我們將代碼改造一下:

<template> <div> <div v-for="(item,k) in prodForm.seqNos" :key="k"> <input type="text" v-model="item.seqNo" /> </div> <button @click="add">增加</button> </div> </template> <script> export default { name: "addInput", mounted(){ this.prodForm = this.basicInfo //初始化 //this.prodForm.seqNos = [] //因basicInfo沒有seqNos,因此重新添加 this.$set(this.prodForm,'seqNos',[]) console.log(this.prodForm) }, data(){ return { prodForm:{ id:'', seqNos:[], }, basicInfo:{ id:1 } } }, methods:{ add(){ this.prodForm.seqNos.push({seqNo:''}) } }, } </script> <style scoped> .btn{ width:100px; margin:10px; } </style> 

這時再打印prodForm變量,發現seqNos數組已經添加了getter和setter,按鈕也生效了:

 

 
 


免責聲明!

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



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