2017-01-22 57 views
1

example的SRC(UserPage.js):在終極版真實世界的例子關於規範

const mapStateToProps = (state, ownProps) => { 
    // We need to lower case the login due to the way GitHub's API behaves. 
    // Have a look at ../middleware/api.js for more details. 
    const login = ownProps.params.login.toLowerCase() 

    const { 
    pagination: { starredByUser }, 
    entities: { users, repos } 
    } = state 

    const starredPagination = starredByUser[login] || { ids: [] } 
    const starredRepos = starredPagination.ids.map(id => repos[id]) 
    const starredRepoOwners = starredRepos.map(repo => users[repo.owner]) 

    return { 
    login, 
    starredRepos, 
    starredRepoOwners, 
    starredPagination, 
    user: users[login] 
    } 
} 

我注意到,有許多模板像xxx.ids.map(id => someEntities[id]),我不知道爲什麼使用這種模式工作.IMO,我會在容器組件中使用類似import { map } from 'lodash'; someList && map(someList, item => {...})的東西,並只傳遞mapStateToProps中的實體。

那麼,有人可以解釋它的目的嗎?謝謝。

+0

不太確定我明白這個問題。你是在問一個關於在ID上映射以獲取項目列表的想法,或者使用'Array.map()'而不是'_.map()'? – markerikson

+0

謝謝reply.I的意思是沒有必要「映射到ID來獲取項目列表」,我們可以做一些像'lodash'中的import {map}; someList && map(someList,item => {...})也可以很好地工作。我們使用'lodash.map'而不是'Array.prototype.map'是因爲我們的數據是由'normalizr'庫規範化的,所以這些項目是一個不是數組的對象。 @markerikson –

+0

這個例子中我反對的原因是(例如,'xxx.ids.map(id => someEntities [id])'),這個步驟之後的結果數據在這個步驟完成之前已經存在。如上所述,我們只需將mapStateToProps中的實體(來自normalizr庫中的規範化數據)傳遞給我們的容器組件@markerikson –

回答

2

在Redux中規範化數據的標準建議是將數據項存儲在一個對象中,其中ID爲鍵,項爲值。但是,一個對象沒有固有的順序。 (從技術上來說,迭代對象鍵應該是一致的順序,但它是一個不好的做法,依靠的是作爲排序的唯一手段。)

正因爲如此,它也是標準存儲的只是一個數組這些ID也是。一個典型的例子可能看起來像:

{ 
    byId : { 
     qwerty : { }, 
     abcd : { }, 
     aj42913 : { }  
    }, 
    items : ["qwerty", "aj42913", "abcd"], 
    sorted : ["abcd", "aj42913", "qwerty"], 
    selected : ["qwerty", "abcd"] 
} 

在這個例子中,items包含所有項目的ID,很可能在他們的插入順序。 sorted包含某種排序順序的ID,而selected包含ID的子集。

這允許項目本身只能存儲一次,而這些項目的多個表示可以使用各種ID數組保存。

從那裏,您可以通過映射任何您關心的ID數組,並通過ID檢索項目,將實際項目列表放在一起。

因此,最終的答案是依靠只是在byId對象的鍵不給你任何種類的排序,並且不允許定義數據的子集。

+1

感謝您的答覆。在我的項目,有一些項目非常簡單(例如,沒有嵌套),它們的id只是數字(例如,迭代對象的順序必須與數組相同),所以這就是爲什麼我發佈這個問題。但是我當然,我知道你的意思。所以,再次感謝! @markerikson –