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。
参数
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 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()
。