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

createStore(reducer, preloadedState?, enhancer?)

创建一个 Redux store,它保存着应用程序的完整状态树。应用程序中应该只有一个 store。

危险

原始 Redux 核心 createStore 方法已弃用!

createStore 将继续无限期地工作,但我们不鼓励直接使用 createStore 或原始 redux 包。

相反,您应该使用我们官方的 configureStore 方法 来自 Redux Toolkit 包,它封装了 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 Toolkit 来处理他们所有的 Redux 逻辑。

要解决此问题,有三种选择

  • 遵循我们的强烈建议,切换到 Redux Toolkit 和 configureStore
  • 什么也不做。它只是一个视觉上的删除线,不会影响代码的行为。忽略它。
  • 切换到使用现在导出的 legacy_createStore API,它与原始函数完全相同,但没有 @deprecated 标签。最简单的选择是进行别名导入重命名,例如 import { legacy_createStore as createStore } from 'redux'

提示

  • 不要在一个应用程序中创建多个 store!相反,使用 combineReducers 从多个 reducer 创建一个根 reducer。

  • Redux 状态通常是普通的 JS 对象和数组。

  • 如果您的状态是普通对象,请确保您永远不会修改它!不可变更新需要对每层数据进行复制,通常使用对象展开运算符(return { ...state, ...newData })。

  • 对于在服务器上运行的通用应用程序,请在每次请求时创建一个 store 实例,以便它们相互隔离。向 store 实例分派一些数据获取操作,并在它们完成之前在服务器上渲染应用程序。

  • 创建 store 时,Redux 会向您的 reducer 分派一个虚拟操作,以使用初始状态填充 store。您不应该直接处理虚拟操作。请记住,如果传递给 reducer 的第一个参数是 undefined,您的 reducer 应该返回某种初始状态,这样就完成了。

  • 要应用多个 store 增强器,可以使用 compose()