createStore: creating a core Redux store">createStore: creating a core Redux store">
跳至主要內容

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 的詳細資訊。

參數

  1. reducer (函式):一個根 reducer 函式,它傳回下一個 狀態樹,給定目前的狀態樹和一個要處理的 動作

  2. [preloadedState] (任何):初始狀態。您可選擇性地指定它以在通用應用程式中從伺服器中注入狀態,或還原先前序列化過的使用者階段。如果您使用 combineReducers 產生 reducer,這必須是一個純粹物件,其形狀與傳遞給它的金鑰相同。否則,您可以自由傳遞任何您的 reducer 可以理解的內容。

  3. [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()