2017-07-21 45 views
0

我爲我的React-Redux應用程序使用服務器端渲染。我想在應用程序啓動時加載一些常量,爲城市的例子名單與相應的ID:在React + Redux中加載靜態常量

[ 
    { 
     name: "London", 
     id: 1 
    } 
    ... 
] 

我認爲這是更好地把這些數據轉化store在服務器端,並提供給使用window.__INITIAL_STATE__客戶端作爲這裏建議http://redux.js.org/docs/recipes/ServerRendering.html

這個常量是隻讀的,我只是爲了數據規範化目的而預加載它們。例如,稍後我可以檢索具有城市ID的用戶列表,而不是具有城市名稱的用戶:{name: "Alex", cities: [1,2]}

問題是,如果我將它們放入存儲區,那麼我會強制爲此常量創建縮減器,否則, m得到這個錯誤:

Unexpected key "cities" found in preloadedState argument passed to createStore. Expected to find one of the known reducer keys instead: "colors". Unexpected keys will be ignored.

所以我正在尋找一些優雅的方式來處理這種情況。

現在我有兩個想法如何處理:

  1. 創建空的減速,它總是會回到默認狀態

    export const cities = (state = [], action={ type: null }) => { 
        return state 
    } 
    
  2. Send from server initial actions with payloads, and execute them on client at startup

    // server.js 
    window.INITIAL_ACTIONS = [ 
        { type: "REQUEST_LOGIN_SUCCESS", user: {userId, userName, userEmail, etc} }, 
        { type: "REQUEST_CITIES_SUCCESS", [..listOfCities] }, 
    ] 
    

而且在我client-index.js,派遣這些行動創造了店之後:

//client-index.js 
window.INITIAL_ACTIONS.forEach(store.dispatch) 

所以,是我的方法之一是好的?或者可能你知道一些其他更優雅的解決方案?

謝謝。

+0

爲什麼應用程序常量需要存儲在存儲中?只要把它們放在窗口對象上。 –

+0

@DannyDelott這是一個非常大的臭不不不。 – Gregg

+0

這是爲什麼?在通用的反應應用程序中,整個狀態在窗口對象上出現。 –

回答

1

我們用一個虛擬的「設置」減速器做類似的事情。即

const rootReducer = combineReducers({ 
    ... 
    settings: (state = {}) => state, 
    ... 
}); 

這給我們一個方便的地方來存儲我們所有的應用程序配置。

只要確保您以相同的方式鍵入您的初始狀態。即

window.__INITIAL_STATE__ = { 
    ... 
    settings: { ... }, 
    ... 
}; 

有些人可能會反對這種做法,但我認爲這聽起來很合理。雖然settings可能是恆定的,但它是狀態。它符合單個狀態對象的重複實踐。 (此外,未來可能會出現設置狀態切片將變爲動態並需要「真實」還原器的問題)。