2017-03-17 106 views
2

我正在使用es6對象解構來爲函數提供默認參數。嵌套參數的ES6對象解構默認值

function mapStateToProps({ shops: { cakeShop: {}, pieShop: {} }) { 
    return { 
    CakeShopName: shops.cakeShop.Name, 
    PieShopName: shops.pieShop.Name 
    } 
} 

上述的問題是,如果我叫

mapStateToProps({}) 

代碼拋出Cannot read property 'Name' of undefinedshops上的嵌套對象未設置爲其默認值,並且代碼具有空引用。

如何確保將shops中的嵌套對象設置爲正確的默認值,即使定義了shops本身?

+0

我不認爲你可以通過解構來做到這一點,它只有在你確定的情況下才有效...... – n00dl3

+0

聽起來像你混淆瞭解構與默認值。你的語法破壞了一個參數對象,但實際上並沒有引入任何參數標識符。 – Bergi

回答

2

喜歡你的聲音都使用默認值混淆解構。你的語法破壞了一個參數對象,但實際上並沒有引入任何參數標識符。你的函數範圍中沒有shops變量。

我假設你實際上想要引入cakeShoppieShop變量,併爲它們提供默認值。要做到這一點,你會寫

function mapStateToProps({ shops: { cakeShop = {}, pieShop = {} }) { 
// short for    { shops: { cakeShop: cakeShop = {}, pieShop: pieShop = {} }) { 
// parameter names (that will be bound):  ^^^^^^^^    ^^^^^^^ 
    return { 
    CakeShopName: cakeShop.Name, 
    PieShopName: pieShop.Name 
    } 
} 

您也可以使用

function mapStateToProps({ shops: { cakeShop: {name: CakeShopName} = {}, pieShop: {name: PieShopName} = {} }) { 
    return {CakeShopName, PieShopName}; 
} 
+0

這是正確的。據我所見,這與@estus的答案相同,但語法更清晰(末尾沒有額外的兩個'= {}') – glcheetham

+0

@glcheetham [需要那些默認值](http:// stackoverflow。 com/q/34275971/1048572),當你希望能夠用一個沒有'shops'屬性或沒有任何參數的對象調用函數。 – Bergi

+0

絕對好奇..我試圖找到這麼久...... – sapy

5

要處理的默認值,嵌套的對象,應該是

function mapStateToProps({ shops: { cakeShop = {}, pieShop = {} } = {} } = {}) { 
... 
} 
+0

這個工作,但現在'商店'是未定義的功能範圍內。如果我需要訪問「商店」上的很多道具會怎麼樣? – glcheetham

+0

問題中的代碼沒有解釋這一點。 cakeShop等可以用作'cakeShop.Name'。如果你真的需要'商店',那麼不要使用param解構,而是使用'const {cakeShop = {},pieShop = {}} = shops'來代替。您不能同時從param解構出商店和cakeShop。 – estus

0

我知道這個問題是關於解構,但對於有興趣的人,我離開的另一種選擇這裏使用lodashunderscore

function mapStateToProps(shops) { 
    _.defaultsDeep(shops, { 
    cakeShop: { 
     Name: "Kiki's CakeShop" 
    }, 
    pieShop: {} 
    }) 

    return { 
    CakeShopName: shops.cakeShop.Name, // defaults to "Kiki's CakeShop" 
    PieShopName: shops.pieShop.Name // undefined if not specified 
    } 
}