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_createStoreAPI,它与原始函数完全相同,但没有@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()。