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

您的位置:首頁技術(shù)文章
文章詳情頁

Vue父子組件傳值的一些坑

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

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

1. 問題描述

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

2. 原因剖析

核心:雙向綁定

父子組件傳值的時(shí)候涉及雙向綁定,當(dāng)傳值為 object 類型時(shí),傳值之后數(shù)據(jù)源會被改變。

深拷貝與淺拷貝

下文詳細(xì)講。

3. 解決方案

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

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

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

4. 深拷貝和淺拷貝

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

下圖為JavaScript復(fù)雜數(shù)據(jù)類型的淺拷貝示意圖:

Vue父子組件傳值的一些坑

淺拷貝

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

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

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

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

/** * 對象的淺拷貝 */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'}/* ------------------------- 華麗的分割線 ------------------------- *//** * 數(shù)組的淺拷貝 */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']

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

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

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

/** * 對象的淺拷貝 * 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,說明外層數(shù)組拷貝的是實(shí)例console.log(obj1.social === obj2.social) // 輸出true,說明對于Object類型的屬性是拷貝引用console.log(obj1.skills === obj2.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用/** * 對象的淺拷貝 * ES6的 Object.assign() 和 對象擴(kuò)展運(yùn)算符... */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,說明外層數(shù)組拷貝的是實(shí)例console.log(obj1.social === obj2.social) // 輸出true,說明對于Object類型的屬性是拷貝引用console.log(obj1.skills === obj2.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用var obj3 = {...obj1};console.log(obj1 === obj3) // 輸出false,說明外層數(shù)組拷貝的是實(shí)例console.log(obj1.skills === obj3.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用console.log(obj1.skills === obj3.skills) // 輸出true,說明對于Array類型的屬性是拷貝引用/* ------------------------- 華麗的分割線 ------------------------- *//** * 數(shù)組的淺拷貝 * Array.prototype.slice() */var arr1 = [{name: 'wenyuan'}, {name: 'Evan You'}];var arr2 = arr1.slice(0);console.log(arr1 === arr2); // 輸出false,說明外層數(shù)組拷貝的是實(shí)例console.log(arr1[0] === arr2[0]); // 輸出true,說明其元素拷貝的是引用/** * 數(shù)組的淺拷貝 * Array.prototype.concat() */var arr1 = [{name: 'wenyuan'}, {name: 'Evan You'}];var arr2 = arr1.concat();console.log(arr1 === arr2); // 輸出false,說明外層數(shù)組拷貝的是實(shí)例console.log(arr1[0] === arr2[0]); // 輸出true,說明其元素拷貝的是引用/** * 數(shù)組的淺拷貝 * ES6的 Object.assign() 和 對象擴(kuò)展運(yùn)算符... * 由于數(shù)組是特殊的對象,所以ES6中的這種方式也可以用于數(shù)組 */var arr1 = [{name: 'wenyuan'}, {name: 'Evan You'}];var arr2 = Object.assign([],arr1)var arr3 = { ...arr1 };console.log(arr1 === arr2); // 輸出false,說明外層數(shù)組拷貝的是實(shí)例console.log(arr1 === arr3); // 輸出false,說明外層數(shù)組拷貝的是實(shí)例console.log(arr1[0] === arr2[0]); // 輸出true,說明其元素拷貝的是引用console.log(arr1[0] === arr3[0]); // 輸出true,說明其元素拷貝的是引用 深拷貝

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

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

/** * 對象的深拷貝 * JSON.stringify()和JSON.parse() * 這種深拷貝最簡單,但有其局限性,上文已經(jīng)提到過了 */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,說明外層數(shù)組拷貝的是實(shí)例console.log(obj1.social === obj2.social) // 輸出false,說明對于Object類型的屬性也是拷貝實(shí)例console.log(obj1.skills === obj2.skills) // 輸出false,說明對于Array類型的屬性也是拷貝實(shí)例/** * 對象的深拷貝 * 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,說明外層數(shù)組拷貝的是實(shí)例console.log(obj1.social === obj2.social) // 輸出false,說明對于Object類型的屬性也是拷貝實(shí)例console.log(obj1.skills === obj2.skills) // 輸出false,說明對于Array類型的屬性也是拷貝實(shí)例/** * 對象的深拷貝 * 也可以自己寫一個(gè)函數(shù)實(shí)現(xiàn),用遞歸+判斷,注意別進(jìn)入死循環(huán)就好 * 這里不舉例了,以前我整理過一篇常用工具類函數(shù)的博客,里面包含了深拷貝函數(shù) *//** * 對象的深拷貝 * 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,說明外層數(shù)組拷貝的是實(shí)例console.log(obj1.social === obj2.social) // 輸出false,說明對于Object類型的屬性也是拷貝實(shí)例console.log(obj1.skills === obj2.skills) // 輸出false,說明對于Array類型的屬性也是拷貝實(shí)例

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

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

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久久一区二区| 91精品在线观看国产| 成人精品国产亚洲| 午夜亚洲福利| 亚洲3区在线| 好看的av在线不卡观看| 日韩伦理一区| 鲁大师影院一区二区三区| 99成人在线视频| 久久不见久久见国语| 日韩欧美2区| 日韩高清成人在线| 国产成人精选| 99久久九九| 精品一区欧美| 在线亚洲自拍| 欧美在线看片| 国产一区2区在线观看| 欧美亚洲激情| 日韩在线成人| 国产精品一级| 老司机免费视频一区二区| 国产亚洲精品美女久久久久久久久久| 国产精选一区| 国产精品白丝一区二区三区| 久久久久99| 丝袜美腿高跟呻吟高潮一区| 一区二区不卡| 色综合视频一区二区三区日韩 | 首页国产欧美日韩丝袜| 国产午夜久久| 91欧美精品| 91综合视频| 91精品91| 亚洲国产福利| 蜜臀久久久久久久| 日本v片在线高清不卡在线观看| 亚洲欧美专区| 国产精品黄网站| 亚洲综合日本| 国产精品66| 日韩av在线免费观看不卡| 国产不卡人人| 日韩国产一二三区| 美日韩精品视频| 精精国产xxxx视频在线播放| 美女视频免费精品| 久久不卡国产精品一区二区| 无码日韩精品一区二区免费| 五月天久久网站| 国产专区一区| 欧美精品一区二区久久| 99国产一区| 久久精品国产大片免费观看| 久久精品国产999大香线蕉| 色综合视频一区二区三区日韩 | 成人在线黄色| 麻豆久久一区| 日韩成人在线看| 日韩av三区| 日韩精品一区二区三区免费视频| 久久久蜜桃一区二区人| 麻豆91精品91久久久的内涵| 视频一区中文字幕国产| 亚洲精品在线a| 另类av一区二区| 1024精品久久久久久久久| a国产在线视频| 国产传媒av在线| 黄色aa久久| 午夜电影亚洲| 99精品视频在线| 九九久久国产| 高清不卡一区| 国产v日韩v欧美v| 99久久激情| 尤物网精品视频| 香蕉精品999视频一区二区| 99精品在线| 激情欧美一区| 婷婷精品久久久久久久久久不卡| 国产农村妇女精品一区二区| 六月婷婷一区| 97国产成人高清在线观看| 性色av一区二区怡红| 91精品国产自产精品男人的天堂| 国产精品啊啊啊| 欧美激情久久久久久久久久久| 欧美日韩国产探花| 精品午夜视频| 日本一区中文字幕| 里番精品3d一二三区| 国产va免费精品观看精品视频| 日韩精品一区二区三区免费观看| 久久高清免费| 亚洲一二av| 国产成人精选| 香蕉成人久久| 日韩深夜视频| 国产日产一区| 国产一区导航| 久久久影院免费| 美女av一区| 蜜桃av一区二区| 国产精品一二| 福利精品一区| 日韩不卡一区二区三区| 欧美日中文字幕| 国产精品www.| 激情婷婷综合| 国产乱码精品一区二区亚洲| 1024精品久久久久久久久| 91p九色成人| 欧美激情另类| 国产乱码精品一区二区三区四区| 欧美亚洲激情| 精品精品国产三级a∨在线| 麻豆9191精品国产| 日本一区二区免费高清| 国产毛片久久久| 午夜一级在线看亚洲| 欧美精品一二| 久久久精品五月天| 成人小电影网站| 高清一区二区三区| 国产精品三级| 麻豆一区二区三区| 久久精品国产免费| 久久视频精品| 麻豆亚洲精品| 亚洲专区欧美专区| 青草国产精品| www.com.cn成人| 久久大逼视频| 精品视频自拍| 牛牛精品成人免费视频| 久久九九99| 欧美黄色一区| 国产精品久久久久久久久免费高清| 亚洲欧美日韩国产一区| 婷婷成人av| 亚洲伦乱视频| 最新国产精品视频| 久久精品国产68国产精品亚洲| 国产精品白丝久久av网站| 亚洲激情二区| 日韩精品视频在线看| 精品视频99| 蜜桃av一区二区| 日韩不卡视频在线观看| 最新国产精品久久久| 亚洲va中文在线播放免费| 青青草伊人久久| 99在线|亚洲一区二区| 久久亚洲人体| 日韩在线观看中文字幕| 精品国产18久久久久久二百| 欧美精品一卡| av一区在线| 欧美日韩1区| 亚洲综合电影一区二区三区| 精品一区电影| 日韩精品国产欧美| 亚洲伊人精品酒店| 伊人久久大香线蕉av不卡| 国产欧美一区二区三区国产幕精品 | 欧美精品福利| 久久福利毛片| 不卡中文字幕| 欧美aa国产视频| 视频福利一区| 日韩精品水蜜桃| 成人日韩在线| 欧美国产一级| 国产精品白丝一区二区三区| 日本午夜精品视频在线观看| 神马午夜在线视频| 国产精品hd| 国产精品成人**免费视频| 青草综合视频| 欧美日韩亚洲一区在线观看| 欧美影院视频| 国产欧美日韩精品高清二区综合区 | 日韩精品亚洲专区| 久久久久久久久99精品大| 国产剧情一区| 日韩美女国产精品| 麻豆精品网站| 99国产精品视频免费观看一公开| 日韩一区二区中文| 精品视频一区二区三区在线观看| 天堂精品久久久久| 午夜亚洲精品| 视频在线观看一区| 香蕉精品999视频一区二区| 欧美日韩国产综合网| 伊人久久国产| 亚洲国产欧美日本视频| 欧产日产国产精品视频| 捆绑调教日本一区二区三区|