日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue父子組件傳值的一些坑

瀏覽:28日期:2022-11-21 18:47:57

在用 Vue 的父子組件傳值時遇到一個冷門的問題,子組件改變值后父組件的值也隨之改變了,特此記錄下原因和解決方式。再系統梳理下 JavaScript 的深拷貝與淺拷貝相關知識點。

1. 問題描述

父組件傳值給子組件,子組件改變傳過來的值后,父組件的值也會跟著改變。這個問題比較冷門,平時如果對組件通信使用得比較簡單,一般不會遇到。

2. 原因剖析

核心:雙向綁定

父子組件傳值的時候涉及雙向綁定,當傳值為 object 類型時,傳值之后數據源會被改變。

深拷貝與淺拷貝

下文詳細講。

3. 解決方案

我目前采用的解決辦法是:傳值的時候不要直接傳數據源,而是通過拷貝或者定義新變量等方式傳值。

簡單處理就 JSON.parse(JSON.stringify(obj)),但是這種簡單粗暴的方法有其局限性。當值為 undefined、function、symbol 會在轉換過程中被忽略。所以,對象值有這三種的話用這種方法會導致屬性丟失。

剩下的就是自寫深拷貝的工具函數,或者直接借助第三方的庫函數,下面展開講。

4. 深拷貝和淺拷貝

JavaScript中的淺拷貝與深拷貝,只是針對復雜數據類型(Object,Array)的復制問題。淺拷貝與深拷貝都可以實現在已有對象上再生出一份的作用。但是對象的實例是存儲在堆內存中然后通過一個引用值去操作對象,由此拷貝的時候就存在兩種情況了:拷貝引用和拷貝實例,這也是淺拷貝和深拷貝的區別。

下圖為JavaScript復雜數據類型的淺拷貝示意圖:

Vue父子組件傳值的一些坑

淺拷貝

淺拷貝是拷貝引用,拷貝后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。

值得注意的是:Object.assgin() 是淺拷貝,它只能深拷貝第一層,深層的還是淺拷貝。因為 Object.assign() 拷貝的是屬性值。假如源對象的屬性值是一個對象的引用,那么它也只指向那個引用。(摘選自MDN)

MDN講述 assign 的時候,就有一個典型的例子,這里是文章鏈接。

下面列舉第一類淺拷貝 - 拷貝原對象的引用:

/** * 對象的淺拷貝 */var obj1 = { name:’wenyuan’, age: 22}var obj2 = obj1;obj2[’job’] = ’coder’;console.log(obj1); //Object {name: 'wenyuan', age: 22, job: 'coder'}console.log(obj2); //Object {name: 'wenyuan', age: 0, job: 'coder'}/* ------------------------- 華麗的分割線 ------------------------- *//** * 數組的淺拷貝 */var arr1 = [1, 2, 3, ’4’];var arr2 = arr1;arr2[1] = 'test'; console.log(arr1); // [1, 'test', 3, '4']console.log(arr2); // [1, 'test', 3, '4']

接下來看第二類淺拷貝 - 源對象拷貝實例,其屬性對象拷貝引用:

這種情況,外層源對象是拷貝實例,如果其屬性元素為復雜數據類型(Object、Array)時,內層元素拷貝引用。

對源對象直接操作,不影響另外一個對象,但是對其屬性操作時候,會改變另外一個對象的屬性的值。

/** * 對象的淺拷貝 * jQuery的 $.extend(a,b) 或 $.extend({},a,b) */var obj1 = { name:’wenyuan’, age: 22, social: { blog: ’www.wenyuanblog.com’ }, skills: [’js’, ’html’, ’css’, ’python’]}var obj2 = $.extend({},obj1);console.log(obj1 === obj2) // 輸出false,說明外層數組拷貝的是實例console.log(obj1.social === obj2.social) // 輸出true,說明對于Object類型的屬性是拷貝引用console.log(obj1.skills === obj2.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用/** * 對象的淺拷貝 * ES6的 Object.assign() 和 對象擴展運算符... */var obj1 = { name:’wenyuan’, age: 22, social: { blog: ’www.wenyuanblog.com’ }, skills: [’js’, ’html’, ’css’, ’python’]}var obj2 = Object.assign({},obj1);console.log(obj1 === obj2) // 輸出false,說明外層數組拷貝的是實例console.log(obj1.social === obj2.social) // 輸出true,說明對于Object類型的屬性是拷貝引用console.log(obj1.skills === obj2.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用var obj3 = {...obj1};console.log(obj1 === obj3) // 輸出false,說明外層數組拷貝的是實例console.log(obj1.skills === obj3.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用console.log(obj1.skills === obj3.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用/* ------------------------- 華麗的分割線 ------------------------- *//** * 數組的淺拷貝 * Array.prototype.slice() */var arr1 = [{name: 'wenyuan'}, {name: 'Evan You'}];var arr2 = arr1.slice(0);console.log(arr1 === arr2); // 輸出false,說明外層數組拷貝的是實例console.log(arr1[0] === arr2[0]); // 輸出true,說明其元素拷貝的是引用/** * 數組的淺拷貝 * Array.prototype.concat() */var arr1 = [{name: 'wenyuan'}, {name: 'Evan You'}];var arr2 = arr1.concat();console.log(arr1 === arr2); // 輸出false,說明外層數組拷貝的是實例console.log(arr1[0] === arr2[0]); // 輸出true,說明其元素拷貝的是引用/** * 數組的淺拷貝 * ES6的 Object.assign() 和 對象擴展運算符... * 由于數組是特殊的對象,所以ES6中的這種方式也可以用于數組 */var arr1 = [{name: 'wenyuan'}, {name: 'Evan You'}];var arr2 = Object.assign([],arr1)var arr3 = { ...arr1 };console.log(arr1 === arr2); // 輸出false,說明外層數組拷貝的是實例console.log(arr1 === arr3); // 輸出false,說明外層數組拷貝的是實例console.log(arr1[0] === arr2[0]); // 輸出true,說明其元素拷貝的是引用console.log(arr1[0] === arr3[0]); // 輸出true,說明其元素拷貝的是引用 深拷貝

在堆中重新分配內存,并且把源對象所有屬性都進行新建拷貝,以保證深拷貝的對象的引用圖不包含任何原有對象或對象圖上的任何對象,拷貝后的對象與原來的對象是完全隔離,互不影響。

下面列舉一些深拷貝的例子:

/** * 對象的深拷貝 * JSON.stringify()和JSON.parse() * 這種深拷貝最簡單,但有其局限性,上文已經提到過了 */var obj1 = { name:’wenyuan’, age: 22, social: { blog: ’www.wenyuanblog.com’ }, skills: [’js’, ’html’, ’css’, ’python’]}var obj2 = JSON.parse(JSON.stringify(obj1));console.log(obj1 === obj2) // 輸出false,說明外層數組拷貝的是實例console.log(obj1.social === obj2.social) // 輸出false,說明對于Object類型的屬性也是拷貝實例console.log(obj1.skills === obj2.skills) // 輸出false,說明對于Array類型的屬性也是拷貝實例/** * 對象的深拷貝 * jQuery的 $.extend(true,a,b) */var obj1 = { name:’wenyuan’, age: 22, social: { blog: ’www.wenyuanblog.com’ }, skills: [’js’, ’html’, ’css’, ’python’]}var obj2 = $.extend(true,obj1);console.log(obj1 === obj2) // 輸出false,說明外層數組拷貝的是實例console.log(obj1.social === obj2.social) // 輸出false,說明對于Object類型的屬性也是拷貝實例console.log(obj1.skills === obj2.skills) // 輸出false,說明對于Array類型的屬性也是拷貝實例/** * 對象的深拷貝 * 也可以自己寫一個函數實現,用遞歸+判斷,注意別進入死循環就好 * 這里不舉例了,以前我整理過一篇常用工具類函數的博客,里面包含了深拷貝函數 *//** * 對象的深拷貝 * lodash的_.cloneDeep */var obj1 = { name:’wenyuan’, age: 22, social: { blog: ’www.wenyuanblog.com’ }, skills: [’js’, ’html’, ’css’, ’python’]}var obj2 = _.cloneDeep(obj1);console.log(obj1 === obj2) // 輸出false,說明外層數組拷貝的是實例console.log(obj1.social === obj2.social) // 輸出false,說明對于Object類型的屬性也是拷貝實例console.log(obj1.skills === obj2.skills) // 輸出false,說明對于Array類型的屬性也是拷貝實例

以上就是JavaScript中的淺拷貝與深拷貝的知識點,以代碼的形式記錄下來,方便回顧。

到此這篇關于Vue父子組件傳值的一些坑的文章就介紹到這了,更多相關Vue父子組件傳值內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲黄页一区| 嫩呦国产一区二区三区av| 久久中文字幕av| 日韩亚洲在线| 奇米色欧美一区二区三区| 国产精品久久久久久久久久白浆 | 国产精品1区| 国产91在线播放精品| 久久一区二区中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩中出| 欧美天堂视频| 亚洲色图综合| 国产成人77亚洲精品www| 久久精品国产68国产精品亚洲| 噜噜噜躁狠狠躁狠狠精品视频| 7m精品国产导航在线| jizzjizz中国精品麻豆| 中文一区二区| 麻豆精品视频在线| 亚洲大全视频| 91大神在线观看线路一区| 日韩欧美午夜| 亚洲精品无吗| 欧美成a人国产精品高清乱码在线观看片在线观看久| 欧美特黄一级| 欧美激情在线精品一区二区三区| 国产91精品对白在线播放| 日韩国产一二三区| 99久久亚洲精品| 欧美日韩视频免费看| 亚洲午夜av| 国产精品hd| 亚洲欧美日韩专区| 卡一精品卡二卡三网站乱码| 亚洲在线观看| 精品国产18久久久久久二百| 久久高清一区| 日韩中文欧美| 国产精品一区二区精品 | 久久亚州av| 蜜桃久久av| 久久uomeier| 国产午夜精品一区在线观看| 亚洲一区二区三区免费在线观看| 久久影院午夜精品| 国产毛片一区二区三区| 欧美网站在线| www.九色在线| 日韩精品成人在线观看| 亚洲天堂久久| 福利在线免费视频| 国产日韩欧美一区| 性色av一区二区怡红| 欧美精品日日操| 国产精品久久| 亚洲欧美网站在线观看| 亚洲婷婷免费| 午夜影院一区| 久久久久97| 欧美一区激情| 美国三级日本三级久久99| 激情欧美丁香| 国内精品亚洲| 国产香蕉精品| 日韩一区二区三区精品| 尹人成人综合网| 播放一区二区| 国产高清亚洲| 91成人在线网站| 中文字幕av一区二区三区四区| 91国语精品自产拍| 91精品国产福利在线观看麻豆| 精品一区av| 国产精品对白| 国产欧美啪啪| 日本成人在线不卡视频| 亚洲一区二区日韩| 国产亚洲午夜| 欧美69视频| 久久久精品久久久久久96| 国产传媒av在线| av日韩中文| 福利精品一区| 国产成人免费av一区二区午夜| 国产精品自在| 欧美1区2区3| 久久男人av| 国产一区二区三区不卡视频网站| 精品香蕉视频| 欧美www视频在线观看| 精品精品国产三级a∨在线| 你懂的网址国产 欧美| 激情中国色综合| 国产成人精品一区二区三区视频 | 成人va天堂| 欧美三级网址| 久久国产精品成人免费观看的软件| 女生影院久久| 久久国产中文字幕| 伊人久久成人| 亚洲一区二区三区中文字幕在线观看| 亚洲我射av| 日本不卡中文字幕| 国产精品色在线网站| 麻豆一区二区在线| 精品视频久久| 日韩在线不卡| 精品在线91| 蜜桃传媒麻豆第一区在线观看| 亚洲精品无播放器在线播放| 日韩动漫一区| 国产极品模特精品一二| 都市激情国产精品| 欧美亚洲在线日韩| 国产亚洲永久域名| 婷婷综合电影| 欧美日韩18| 精品中国亚洲| 欧美午夜精彩| 亚洲免费专区| 欧美一级一区| 成人国产精品| 亚洲成人日韩| 日韩一区二区三区在线看| 国产精品男女| 精品一二三区| 亚洲国产专区校园欧美| 亚洲精品在线国产| 久久亚洲资源中文字| 亚洲手机在线| 日韩一区二区三区高清在线观看| 麻豆成人91精品二区三区| 日韩欧美自拍| 爽爽淫人综合网网站| 国产精品香蕉| 国产麻豆久久| 亚洲香蕉久久| 精品网站aaa| 欧美 日韩 国产一区二区在线视频 | 国产aⅴ精品一区二区三区久久 | 欧美gv在线| 日韩精品一二三| 国产精品xxx在线观看| 色网在线免费观看| 蜜桃一区二区三区在线观看| 精品国产中文字幕第一页| 在线视频观看日韩| 日韩精品国产精品| 免费污视频在线一区| 亚洲麻豆一区| 日本免费久久| 婷婷亚洲成人| 九色porny丨国产首页在线| 亚洲欧美日韩综合国产aⅴ| 你懂的国产精品永久在线| 婷婷成人综合| 欧美日韩夜夜| 亚洲婷婷在线| 国产精品一区二区三区美女| 亚洲性图久久| 久久av综合| 亚洲主播在线| 精品中文字幕一区二区三区| 国产精品免费看| 久久久久伊人| 免费观看在线综合| 中文字幕在线视频久| 亚洲青青久久| 99热精品久久| 欧美激情精品| 欧美日一区二区| 国产精品伦一区二区| 亚洲黄色在线| 激情黄产视频在线免费观看| 日韩欧美久久| 欧美日韩在线播放视频| 久久中文欧美| 少妇精品久久久一区二区三区| 日韩在线观看一区| 国产精品高清一区二区| 巨乳诱惑日韩免费av| 女生影院久久| 久久福利在线| 午夜天堂精品久久久久| 国产一区日韩一区| 久久精品一区二区三区中文字幕| 三级亚洲高清视频| 久久高清免费| 日本一二区不卡| 欧美亚洲人成在线| 伊人久久大香伊蕉在人线观看热v| 久久国产日韩| 国内自拍视频一区二区三区| 国产欧美日韩一区二区三区在线| 日韩在线一二三区| 激情久久中文字幕| 色网在线免费观看| 免费看一区二区三区| 日韩精品国产精品|