vue對象拷貝,解決由于引用賦值修改原對象的方式
更新時間:2023年10月18日 09:58:41 作者:qq_41831968
這篇文章主要介紹了vue對象拷貝,解決由于引用賦值修改原對象的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
vue對象拷貝,解決由于引用賦值修改原對象
在vue項目中,遇到了一個問題,前端需要將后臺返回的數據展示在界面上,但是由于多了一個修改功能,點擊修改按鈕會彈出一個彈框,彈框所有要修改的內容和之前展示的一樣,在彈框里修改原來界面的值也會一起變化,這顯然不太合適(問題不好描述,直接上代碼吧)
<!-- 展示的界面--> <el-form-item label="手機號"> <el-input v-model="form.account"></el-input> </el-form-item> <!-- 修改的彈框--> <el-dialog> <el-form-item label="手機號"> <el-input v-model="form.account"></el-input> <el-input v-model="newForm.account"></el-input> </el-form-item> </el-dialog>
export default {
data() {
return {
form: {},
newForm:{}
}
},
methods: {
request() {
//這里是請求的方法,懶得寫了,因為返回的數據才是要處理的重點
this.$post('xxx/xxxx',params)
.then(res=>{
//將返回的數據直接賦值給form,然后直接在界面上展示
this.form = res;
//這時候問題就來了,因為彈框要修改的內容也是同樣的數據,如果使用同一個對象this.form,
//那么在彈框里修改的是同一個對象
//即使新建一個對象再用返回的數據給它賦值,結果也是相同的,因為對象的賦值是引用賦值
//this.newForm = res;
//解決方法其實挺簡單,Object.assign解決,
this.newForm = Object.assign({}, res)
//使用上面這個方法是完全復制了一個新的對象,即使修改這個newForm也不會影響form
})
}
}
}
vue踩坑--賦值后原對象的值改變
//vue定義變量data() {
return { //初始表格數組對象
tableData:[], //被賦值對象
newlData:[] //被賦值對象
}
}問題原因
簡單的賦值沒有創(chuàng)建一個新的對象內存地址,只是把newlData的內存地址指向了tableData的內存地址,一旦tableData的內存地址值發(fā)生改變,newlData的數據也會對應改變。
解決辦法
方法1、創(chuàng)建一個新的對象,指向新的內存地址,通過JSON解析
let datas = JSON.parse(JSON.stringify(this.tableData));
方法2、es6之展開Object.assign(拷貝obj的內容到一個新的堆內存,copyObj存儲新內存的引用)
let datas = Object.assign({},this.tableData);方法3、es6之展開運算符(僅用于數組)
let copyArr = [...this.tableData];
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

