Redux 是一个用于可预测且可维护的全局状态管理的 JS 库。
它可以帮助您编写行为一致、可在不同环境(客户端、服务器和原生环境)中运行且易于测试的应用程序。此外,它还提供卓越的开发者体验,例如实时代码编辑与时间旅行调试器 等。
您可以将 Redux 与 React 或任何其他视图库一起使用。Redux 核心非常小巧(2kB,包括依赖项),并且拥有丰富的插件生态系统。
Redux Toolkit 是我们官方推荐的编写 Redux 逻辑的方法。它封装了 Redux 核心,并包含我们认为构建 Redux 应用所必需的软件包和函数。Redux Toolkit 内置了我们建议的最佳实践,简化了大多数 Redux 任务,避免了常见错误,并使编写 Redux 应用程序变得更加轻松。
推荐使用 React 和 Redux Toolkit 构建新应用的方式是使用我们官方的 Vite Redux Toolkit + TS 模板,或者使用 Next 的 with-redux
模板 创建一个 Next.js 项目。
以上两种方式都已针对该构建工具正确配置了 Redux Toolkit 和 React-Redux,并附带一个小示例应用,演示了如何使用 Redux Toolkit 的多项功能。
# Vite with our Redux+TS template
# (using the `degit` tool to clone and extract the template)
npx degit reduxjs/redux-templates/packages/vite-template-redux my-app
# Next.js using the `with-redux` template
npx create-next-app --example with-redux my-app
我们目前没有官方的 React Native 模板,但推荐使用以下标准 React Native 和 Expo 模板:
npm install @reduxjs/toolkit react-redux
Redux 核心库本身:
npm install redux
更多详情,请参阅安装文档页面。
Redux 核心文档位于 https://redux.js.org,其中包含完整的 Redux 教程以及常规 Redux 模式的使用指南:
Redux Toolkit 文档位于 https://redux-toolkit.js.org,其中包含 Redux Toolkit 中所有 API 的 API 参考和使用指南。
Redux 基础教程 是一个“自上而下”的教程,讲解如何正确使用 Redux,并使用我们最新推荐的 API 和最佳实践。我们建议从这里开始学习。
Redux 基础教程 是一个“自下而上”的教程,讲解 Redux 的工作原理,从基本原理出发,不包含任何抽象,并解释 Redux 标准使用模式的存在原因。
Reactiflux Discord 社区 的 #redux 频道 是我们所有关于学习和使用 Redux 问题的官方资源。Reactiflux 是一个交流、提问和学习的好地方——欢迎加入我们!
Redux 是组织状态的有效工具,但您也应该考虑它是否适合您的情况。请不要仅仅因为有人说您应该使用 Redux 就使用它——相反,请花一些时间了解使用它的潜在优势和利弊。
以下是一些关于何时使用 Redux 的建议:
是的,这些指导原则是主观且模糊的,但这是有充分理由的。对于每个用户和每个应用程序来说,将 Redux 集成到应用程序中的时机都是不同的。
有关如何使用 Redux 的更多思考,请参阅:
应用的整个全局状态存储在单个 store 内的对象树中。
更改状态树的唯一方法是创建一个 action(一个描述发生事件的对象),并将其 dispatch 到 store。
要指定如何响应 action 更新状态,您可以编写纯 reducer 函数,该函数根据旧状态和 action 计算新状态。
Redux Toolkit 简化了编写 Redux 逻辑和设置 store 的过程。使用 Redux Toolkit,基本应用逻辑如下所示:
import { createSlice, configureStore } from '@reduxjs/toolkit'
const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0
},
reducers: {
incremented: state => {
// Redux Toolkit allows us to write "mutating" logic in reducers. It
// doesn't actually mutate the state because it uses the Immer library,
// which detects changes to a "draft state" and produces a brand new
// immutable state based off those changes
state.value += 1
},
decremented: state => {
state.value -= 1
}
}
})
export const { incremented, decremented } = counterSlice.actions
const store = configureStore({
reducer: counterSlice.reducer
})
// Can still subscribe to the store
store.subscribe(() => console.log(store.getState()))
// Still pass action objects to `dispatch`, but they're created for us
store.dispatch(incremented())
// {value: 1}
store.dispatch(incremented())
// {value: 2}
store.dispatch(decremented())
// {value: 1}
Redux Toolkit 使我们能够编写更简洁、更易读的逻辑,同时仍然遵循 Redux 的原始核心行为和数据流。
您可以在 GitHub 上找到官方 Logo。
本项目遵循 语义化版本控制。
每个版本以及迁移说明均记录在 GitHub 发布 页面上。