createStore(reducer, preloadedState?, enhancer?)
建立一個 Redux 儲存,其中包含應用程式的完整狀態樹狀結構。應用程式中應該只有一個儲存。
原始 Redux 核心 createStore
方法已棄用!
createStore
將會持續運作,但我們不建議直接使用 createStore
或原始的 redux
套件。
相反地,您應該使用我們的官方 Redux Toolkit 套件中的 configureStore
方法,它包裝了 createStore
以提供更好的預設設定和組態方法。您也應該使用 Redux Toolkit 的 createSlice
方法 來撰寫 reducer 邏輯。
Redux Toolkit 也重新匯出了 redux
套件中包含的所有其他 API。
請參閱 移轉到現代 Redux 頁面,以取得有關如何更新您現有的舊版 Redux 程式碼庫以使用 Redux Toolkit 的詳細資訊。
參數
reducer
(函式):一個根 reducer 函式,它傳回下一個 狀態樹,給定目前的狀態樹和一個要處理的 動作。[
preloadedState
] (任何):初始狀態。您可選擇性地指定它以在通用應用程式中從伺服器中注入狀態,或還原先前序列化過的使用者階段。如果您使用combineReducers
產生reducer
,這必須是一個純粹物件,其形狀與傳遞給它的金鑰相同。否則,您可以自由傳遞任何您的reducer
可以理解的內容。[
enhancer
] (函式):儲存增強器。您可選擇性地指定它以透過第三方功能(例如中間件、時光旅行、持久性等)增強儲存。唯一與 Redux 一起提供的儲存增強器是applyMiddleware()
。
傳回
(Store
):一個包含您應用程式完整狀態的物件。變更其狀態的唯一方法是 發送動作。您也可以 訂閱 其狀態的變更以更新 UI。
範例
import { createStore } from 'redux'
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return state.concat([action.text])
default:
return state
}
}
const store = createStore(todos, ['Use Redux'])
store.dispatch({
type: 'ADD_TODO',
text: 'Read the docs'
})
console.log(store.getState())
// [ 'Use Redux', 'Read the docs' ]
棄用和替代的 legacy_createStore
匯出
在 Redux 4.2.0 中,我們將原始的 createStore
方法標記為 @deprecated
。嚴格來說,這不是重大變更,在 5.0 中也不是新的,但我們在此處記錄它以求完整性。
此廢棄僅為視覺指標,旨在鼓勵使用者將其應用程式從舊版 Redux 模式遷移至使用現代 Redux Toolkit API。此廢棄在匯入和使用時會產生視覺上的刪除線,例如 ,但不會產生執行時期錯誤或警告。createStore
createStore
將持續運作,且不會被移除。但我們希望所有 Redux 使用者都能在所有 Redux 邏輯中使用 Redux Toolkit。
若要修復此問題,有三個選項
- 強烈建議您切換至 Redux Toolkit 和
configureStore
- 不執行任何動作。這只是一個視覺上的刪除線,不會影響您的程式碼行為。請忽略它。
- 切換至使用現已匯出的
legacy_createStore
API,此 API 與確切相同的功能,但沒有@deprecated
標籤。最簡單的選項是進行別名匯入重新命名,例如import { legacy_createStore as createStore } from 'redux'
提示
不要在應用程式中建立多個儲存體!請改用
combineReducers
從多個儲存體建立單一根儲存體。Redux 狀態通常是純 JS 物件和陣列。
如果您的狀態是純物件,請確保您從不變更它!不可變更新需要複製每個層級的資料,通常使用物件擴散運算子 (
return { ...state, ...newData }
)。對於在伺服器上執行的通用應用程式,請使用每個要求建立儲存體執行個體,以便將它們隔離。將一些資料擷取動作傳送至儲存體執行個體,並在伺服器上呈現應用程式之前,等待它們完成。
當建立儲存體時,Redux 會將虛擬動作傳送至您的儲存體,以使用初始狀態填充儲存體。您不應直接處理虛擬動作。請記住,如果傳遞給您的儲存體的第一個引數的狀態為
undefined
,則您的儲存體應傳回某種初始狀態,這樣就設定完成了。若要套用多個儲存體加強器,您可以使用
compose()
。