Redux is a predictable state container for JavaScript apps.
(If you're looking for a WordPress framework, check out Redux Framework.)

It helps you write applications that behave consistently, run in different environments (client, server, and native), and are easy to test. On top of that, it provides a great developer experience, such as live code editing combined with a time traveling debugger.

You can use Redux together with React, or with any other view library.
It is tiny (2kB, including dependencies).

build status npm version npm downloads redux channel on discord #rackt on freenode Changelog #187

Learn Redux from its creator:
Part 1: Getting Started with Redux (30 free videos)
Part 2: Building React Applications with Idiomatic Redux (27 free videos)

Testimonials

“Love what you're doing with Redux”
Jing Chen, creator of Flux

“I asked for comments on Redux in FB's internal JS discussion group, and it was universally praised. Really awesome work.”
Bill Fisher, author of Flux documentation

“It's cool that you are inventing a better Flux by not doing Flux at all.”
André Staltz, creator of Cycle

Before Proceeding Further

Also read:
You Might Not Need Redux

Developer Experience

I wrote Redux while working on my React Europe talk called “Hot Reloading with Time Travel”. My goal was to create a state management library with minimal API but completely predictable behavior, so it is possible to implement logging, hot reloading, time travel, universal apps, record and replay, without any buy-in from the developer.

Influences

Redux evolves the ideas of Flux, but avoids its complexity by taking cues from Elm.
Whether you have used them or not, Redux only takes a few minutes to get started with.

Installation

To install the stable version:

npm install --save redux

This assumes you are using npm as your package manager.

If you're not, you can access these files on unpkg, download them, or point your package manager to them.

Most commonly people consume Redux as a collection of CommonJS modules. These modules are what you get when you import redux in a Webpack, Browserify, or a Node environment. If you like to live on the edge and use Rollup, we support that as well.

If you don't use a module bundler, it's also fine. The redux npm package includes precompiled production and development UMD builds in the dist folder. They can be used directly without a bundler and are thus compatible with many popular JavaScript module loaders and environments. For example, you can drop a UMD build as a <script> tag on the page, or tell Bower to install it. The UMD builds make Redux available as a window.Redux global variable.

The Redux source code is written in ES2015 but we precompile both CommonJS and UMD builds to ES5 so they work in any modern browser. You don't need to use Babel or a module bundler to get started with Redux.

Complementary Packages

Most likely, you'll also need the React bindings and the developer tools.

npm install --save react-redux
npm install --save-dev redux-devtools

Note that unlike Redux itself, many packages in the Redux ecosystem don't provide UMD builds, so we recommend using CommonJS module bundlers like Webpack and Browserify for the most comfortable development experience.

The Gist

The whole state of your app is stored in an object tree inside a single store.
The only way to change the state tree is to emit an action, an object describing what happened.
To specify how the actions transform the state tree, you write pure reducers.

That's it!

import { createStore } from 'redux'

/**
 * This is a reducer, a pure function with (state, action) => state signature.
 * It describes how an action transforms the state into the next state.
 *
 * The shape of the state is up to you: it can be a primitive, an array, an object,
 * or even an Immutable.js data structure. The only important part is that you should
 * not mutate the state object, but return a new object if the state changes.
 *
 * In this example, we use a `switch` statement and strings, but you can use a helper that
 * follows a different convention (such as function maps) if it makes sense for your
 * project.
 */
function counter(state = 0, action) {
  switch (action.type) {
  case 'INCREMENT':
    return state + 1
  case 'DECREMENT':
    return state - 1
  default:
    return state
  }
}

// Create a Redux store holding the state of your app.
// Its API is { subscribe, dispatch, getState }.
let store = createStore(counter)

// You can use subscribe() to update the UI in response to state changes.
// Normally you'd use a view binding library (e.g. React Redux) rather than subscribe() directly.
// However it can also be handy to persist the current state in the localStorage.

store.subscribe(() =>
  console.log(store.getState())
)

// The only way to mutate the internal state is to dispatch an action.
// The actions can be serialized, logged or stored and later replayed.
store.dispatch({ type: 'INCREMENT' })
// 1
store.dispatch({ type: 'INCREMENT' })
// 2
store.dispatch({ type: 'DECREMENT' })
// 1

Instead of mutating the state directly, you specify the mutations you want to happen with plain objects called actions. Then you write a special function called a reducer to decide how every action transforms the entire application's state.

If you're coming from Flux, there is a single important difference you need to understand. Redux doesn't have a Dispatcher or support many stores. Instead, there is just a single store with a single root reducing function. As your app grows, instead of adding stores, you split the root reducer into smaller reducers independently operating on the different parts of the state tree. This is exactly like how there is just one root component in a React app, but it is composed out of many small components.

This architecture might seem like an overkill for a counter app, but the beauty of this pattern is how well it scales to large and complex apps. It also enables very powerful developer tools, because it is possible to trace every mutation to the action that caused it. You can record user sessions and reproduce them just by replaying every action.

Learn Redux from Its Creator

Getting Started with Redux is a video course consisting of 30 videos narrated by Dan Abramov, author of Redux. It is designed to complement the “Basics” part of the docs while bringing additional insights about immutability, testing, Redux best practices, and using Redux with React. This course is free and will always be.

“Great course on egghead.io by @dan_abramov - instead of just showing you how to use #redux, it also shows how and why redux was built!”
Sandrino Di Mattia

“Plowing through @dan_abramov 'Getting Started with Redux' - its amazing how much simpler concepts get with video.”
Chris Dhanaraj

“This video series on Redux by @dan_abramov on @eggheadio is spectacular!”
Eddie Zaneski

“Come for the name hype. Stay for the rock solid fundamentals. (Thanks, and great job @dan_abramov and @eggheadio!)”
Dan

“This series of videos on Redux by @dan_abramov is repeatedly blowing my mind - gunna do some serious refactoring”
Laurence Roberts

So, what are you waiting for?

Watch the 30 Free Videos!

If you enjoyed my course, consider supporting Egghead by buying a subscription. Subscribers have access to the source code for the example in every one of my videos, as well as to tons of advanced lessons on other topics, including JavaScript in depth, React, Angular, and more. Many Egghead instructors are also open source library authors, so buying a subscription is a nice way to thank them for the work that they've done.

Documentation

For PDF, ePub, and MOBI exports for offline reading, and instructions on how to create them, please see: paulkogel/redux-offline-docs.

For Offline docs, please see: devdocs

Examples

If you're new to the NPM ecosystem and have troubles getting a project up and running, or aren't sure where to paste the gist above, check out simplest-redux-example that uses Redux together with React and Browserify.

Discussion

Join the #redux channel of the Reactiflux Discord community.

Thanks

Special thanks to Jamie Paton for handing over the redux NPM package name.

Logo

You can find the official logo on GitHub.

Change Log

This project adheres to Semantic Versioning.
Every release, along with the migration instructions, is documented on the Github Releases page.

Patrons

The work on Redux was funded by the community.
Meet some of the outstanding companies that made it possible:

See the full list of Redux patrons., as well as the always-growing list of people and companies that use Redux.

License

MIT



Redux是JavaScript应用程序的可预测状态容器 (如果您正在寻找WordPress框架,请查看 Redux Framework 。)

它可以帮助您编写行为一致的应用程序,在不同的环境(客户端,服务器和本机)中运行,并且易于测试。除此之外,它提供了一个伟大的开发人员体验,例如与实时代码编辑相结合的时间旅行调试器。 p>

您可以将Redux与 React 或任何其他视图库一起使用。
它很小(2kB,包括依赖)。

建立状态 NPM版本 NPM下载 终极版信道上不和谐 #rackt 更改日志#187

Learn Redux from its creator:
Part 1: Getting Started with Redux (30 free videos)
Part 2: Building React Applications with Idiomatic Redux (27 free videos)

见证

Love what you're doing with Redux
Jing Chen, creator of Flux

I asked for comments on Redux in FB's internal JS discussion group, and it was universally praised. Really awesome work.
Bill Fisher, author of Flux documentation

It's cool that you are inventing a better Flux by not doing Flux at all.
André Staltz, creator of Cycle

继续进行之前

Also read:
You Might Not Need Redux

开发人员体验

在我的React Europe谈话中,我写了Redux,名为随时随地重新加载。我的目标是以最少的API创建一个状态管理库,但是完全可预测的行为,所以可以实现日志记录,热重新加载,时间旅行,通用应用程序,记录和重播,而无需开发人员的购买。 >

影响

Redux发展了 Flux 的想法,但通过从Elm 无论您是否使用它们,Redux只需几分钟即可开始使用。

安装

要安装稳定版本:

npm install –save redux

假设您正在使用 npm 作为包裹经理。

如果没有,您可以在unpkg上访问这些文件,下载它们,或将您的软件包管理器指向他们。 / p>

最常见的是,人们将Redux作为 CommonJS 模块的集合。这些模块是您在 Webpack redux 时获得的模块browserify.org/“>浏览服务或Node环境。如果您喜欢生活在边缘,并使用汇总,我们也支持。

如果您不使用模块绑定器,这也很好。 redux npm包包括预编译的生产和开发 UMD dist 文件夹。它们可以直接使用而不需要捆绑器,因此与许多流行的JavaScript模块加载程序和环境兼容。例如,您可以将UMD构建作为 &lt; script&gt; 标签放在该页面或告诉Bower安装它。 UMD构建使Redux可以作为一个 window.Redux 全局变量。

Redux源代码是用ES2015编写的,但是我们将CommonJS和UMD构建预编译为ES5,以便它们可以在任何现代浏览器。您不需要使用Babel或模块​​绑定器开始使用Redux < / a>。

Complementary Packages

很可能,您还需要反应绑定开发人员工具

npm install –save react-redux
npm install –save-dev redux-devtools
请注意,与Redux本身不同,Redux生态系统中的许多软件包不提供UMD构建,因此我们建议使用CommonJS模块捆绑器,如 Webpack Browserify ,以获得最舒适的开发经验。

Gist

您的应用程序的整个状态存储在单个存储中的对象树中 更改状态树的唯一方法是发出一个动作,一个描述发生了什么的对象 要指定操作如何转换状态树,您可以编写纯粹的 reducer

就是这样!

import { createStore } from 'redux'

/** * This is a reducer, a pure function with (state, action) => state signature. * It describes how an action transforms the state into the next state. * * The shape of the state is up to you: it can be a primitive, an array, an object, * or even an Immutable.js data structure. The only important part is that you should * not mutate the state object, but return a new object if the state changes. * * In this example, we use a switch statement and strings, but you can use a helper that * follows a different convention (such as function maps) if it makes sense for your * project. */ function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 default: return state } }

// Create a Redux store holding the state of your app. // Its API is { subscribe, dispatch, getState }. let store = createStore(counter)

// You can use subscribe() to update the UI in response to state changes. // Normally you'd use a view binding library (e.g. React Redux) rather than subscribe() directly. // However it can also be handy to persist the current state in the localStorage.

store.subscribe(() => console.log(store.getState()) )

// The only way to mutate the internal state is to dispatch an action. // The actions can be serialized, logged or stored and later replayed. store.dispatch({ type: 'INCREMENT' }) // 1 store.dispatch({ type: 'INCREMENT' }) // 2 store.dispatch({ type: 'DECREMENT' }) // 1

而不是直接突变状态,您可以使用称为动作的普通对象来指定要发生的突变。然后,您编写一个名为 reducer 的特殊功能来决定每个操作如何转换整个应用程序的状态。

如果您来自Flux,您需要了解一个重要的区别。 Redux没有Dispatcher或支持很多商店。相反,只有一个具有单个根减少功能的存储。随着应用程序的发展,您可以将根减速器分为独立操作在状态树不同部分的较小的reducer,而不是添加存储。这与React应用程序中只有一个根组件完全一样,但是它由许多小组件组成。

这个架构可能看起来像一个柜台应用程序的过分,但这种模式的优点是它可以扩展到大型和复杂的应用程序。它还支持非常强大的开发人员工具,因为它可以跟踪导致它的动作的每一个突变。您可以通过重播每个动作来记录用户会话并重现它们。

从其创建者学习Redux

Redux入门是由Dan Abramov撰写的30部影片, Redux。它旨在补充文档的基础部分,同时提供有关不变性,测试,Redux最佳实践以及使用Redux with React的更多见解。 本课程是免费的,永远是。

Great course on egghead.io by @dan_abramov - instead of just showing you how to use #redux, it also shows how and why redux was built!
Sandrino Di Mattia

Plowing through @dan_abramov 'Getting Started with Redux' - its amazing how much simpler concepts get with video.
Chris Dhanaraj

This video series on Redux by @dan_abramov on @eggheadio is spectacular!
Eddie Zaneski

Come for the name hype. Stay for the rock solid fundamentals. (Thanks, and great job @dan_abramov and @eggheadio!)
Dan

This series of videos on Redux by @dan_abramov is repeatedly blowing my mind - gunna do some serious refactoring
Laurence Roberts

那么你还在等什么?

Watch the 30 Free Videos!

如果您喜欢我的课程,请考虑通过购买订阅来支持Egghead。订阅者可以访问我每个视频中的示例的源代码,以及其他主题的大量高级课程,包括深入的JavaScript,React,Angular等。许多 Egghead教练也是开放源代码库作者,所以购买订阅是感谢他们所做的工作的好方法。

文档

对于PDF,ePub和MOBI导出以进行离线阅读,以及有关如何创建它们的说明,请参阅: paulkogel / redux-offline-docs

对于离线文档,请参阅: devdocs

示例

如果您是新来的NPM生态系统,并且遇到项目启动和运行的麻烦,或者不确定上面贴上的要点,请查看 minimalest-redux-example ,它们与React和Browserify一起使用Redux。

讨论

加入 Reactiflux #redux 频道> Discord社区。</​​ p>

谢谢

特别感谢 Jamie Paton 交出 redux NPM包名称。

标志

您可以在GitHub上找到官方徽标

更改日志

该项目遵守语义版本控制
每个版本以及迁移说明都记录在Github 版本页面上。

赞助人

Redux上的工作是由社区资助的
认识一些优秀的公司,使其成为可能:

查看Redux顾客的完整列表,以及始终如一的使用Redux的人员和公司

许可证

麻省理工学院




相关问题推荐