1 | # <a href='https://redux.js.org'><img src='https://camo.githubusercontent.com/f28b5bc7822f1b7bb28a96d8d09e7d79169248fc/687474703a2f2f692e696d6775722e636f6d2f4a65567164514d2e706e67' height='60' alt='Redux Logo' aria-label='redux.js.org' /></a>
|
---|
2 |
|
---|
3 | Redux is a predictable state container for JavaScript apps.
|
---|
4 |
|
---|
5 | 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](https://github.com/reduxjs/redux-devtools).
|
---|
6 |
|
---|
7 | You can use Redux together with [React](https://react.dev), or with any other view library. The Redux core is tiny (2kB, including dependencies), and has a rich ecosystem of addons.
|
---|
8 |
|
---|
9 | [**Redux Toolkit**](https://redux-toolkit.js.org) is our official recommended approach for writing Redux logic. It wraps around the Redux core, and contains packages and functions that we think are essential for building a Redux app. Redux Toolkit builds in our suggested best practices, simplifies most Redux tasks, prevents common mistakes, and makes it easier to write Redux applications.
|
---|
10 |
|
---|
11 | 
|
---|
12 | [](https://www.npmjs.com/package/redux)
|
---|
13 | [](https://www.npmjs.com/package/redux)
|
---|
14 | [](https://discord.gg/0ZcbPKXt5bZ6au5t)
|
---|
15 |
|
---|
16 | ## Installation
|
---|
17 |
|
---|
18 | ### Create a React Redux App
|
---|
19 |
|
---|
20 | The recommended way to start new apps with React and Redux Toolkit is by using [our official Redux Toolkit + TS template for Vite](https://github.com/reduxjs/redux-templates), or by creating a new Next.js project using [Next's `with-redux` template](https://github.com/vercel/next.js/tree/canary/examples/with-redux).
|
---|
21 |
|
---|
22 | Both of these already have Redux Toolkit and React-Redux configured appropriately for that build tool, and come with a small example app that demonstrates how to use several of Redux Toolkit's features.
|
---|
23 |
|
---|
24 | ```bash
|
---|
25 | # Vite with our Redux+TS template
|
---|
26 | # (using the `degit` tool to clone and extract the template)
|
---|
27 | npx degit reduxjs/redux-templates/packages/vite-template-redux my-app
|
---|
28 |
|
---|
29 | # Next.js using the `with-redux` template
|
---|
30 | npx create-next-app --example with-redux my-app
|
---|
31 | ```
|
---|
32 |
|
---|
33 | We do not currently have official React Native templates, but recommend these templates for standard React Native and for Expo:
|
---|
34 |
|
---|
35 | - https://github.com/rahsheen/react-native-template-redux-typescript
|
---|
36 | - https://github.com/rahsheen/expo-template-redux-typescript
|
---|
37 |
|
---|
38 | ```
|
---|
39 | npm install @reduxjs/toolkit react-redux
|
---|
40 | ```
|
---|
41 |
|
---|
42 | For the Redux core library by itself:
|
---|
43 |
|
---|
44 | ```
|
---|
45 | npm install redux
|
---|
46 | ```
|
---|
47 |
|
---|
48 | For more details, see [the Installation docs page](https://redux.js.org/introduction/installation).
|
---|
49 |
|
---|
50 | ## Documentation
|
---|
51 |
|
---|
52 | The Redux core docs are located at **https://redux.js.org**, and include the full Redux tutorials, as well usage guides on general Redux patterns:
|
---|
53 |
|
---|
54 | - [Introduction](https://redux.js.org/introduction/getting-started)
|
---|
55 | - [Tutorials](https://redux.js.org/tutorials/index)
|
---|
56 | - [Usage Guides](https://redux.js.org/usage/index)
|
---|
57 | - [FAQ](https://redux.js.org/faq)
|
---|
58 | - [API Reference](https://redux.js.org/api/api-reference)
|
---|
59 |
|
---|
60 | The Redux Toolkit docs are available at **https://redux-toolkit.js.org**, including API references and usage guides for all of the APIs included in Redux Toolkit.
|
---|
61 |
|
---|
62 | ## Learn Redux
|
---|
63 |
|
---|
64 | ### Redux Essentials Tutorial
|
---|
65 |
|
---|
66 | The [**Redux Essentials tutorial**](https://redux.js.org/tutorials/essentials/part-1-overview-concepts) is a "top-down" tutorial that teaches "how to use Redux the right way", using our latest recommended APIs and best practices. We recommend starting there.
|
---|
67 |
|
---|
68 | ### Redux Fundamentals Tutorial
|
---|
69 |
|
---|
70 | The [**Redux Fundamentals tutorial**](https://redux.js.org/tutorials/fundamentals/part-1-overview) is a "bottom-up" tutorial that teaches "how Redux works" from first principles and without any abstractions, and why standard Redux usage patterns exist.
|
---|
71 |
|
---|
72 | ### Help and Discussion
|
---|
73 |
|
---|
74 | The **[#redux channel](https://discord.gg/0ZcbPKXt5bZ6au5t)** of the **[Reactiflux Discord community](https://www.reactiflux.com)** is our official resource for all questions related to learning and using Redux. Reactiflux is a great place to hang out, ask questions, and learn - please come and join us there!
|
---|
75 |
|
---|
76 | ## Before Proceeding Further
|
---|
77 |
|
---|
78 | Redux is a valuable tool for organizing your state, but you should also consider whether it's appropriate for your situation. Please don't use Redux just because someone said you should - instead, please take some time to understand the potential benefits and tradeoffs of using it.
|
---|
79 |
|
---|
80 | Here are some suggestions on when it makes sense to use Redux:
|
---|
81 |
|
---|
82 | - You have reasonable amounts of data changing over time
|
---|
83 | - You need a single source of truth for your state
|
---|
84 | - You find that keeping all your state in a top-level component is no longer sufficient
|
---|
85 |
|
---|
86 | Yes, these guidelines are subjective and vague, but this is for a good reason. The point at which you should integrate Redux into your application is different for every user and different for every application.
|
---|
87 |
|
---|
88 | > **For more thoughts on how Redux is meant to be used, please see:**<br>
|
---|
89 | >
|
---|
90 | > - **[When (and when not) to reach for Redux](https://changelog.com/posts/when-and-when-not-to-reach-for-redux)**
|
---|
91 | > - **[You Might Not Need Redux](https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367)**<br>
|
---|
92 | > - **[The Tao of Redux, Part 1 - Implementation and Intent](https://blog.isquaredsoftware.com/2017/05/idiomatic-redux-tao-of-redux-part-1/)**<br>
|
---|
93 | > - **[The Tao of Redux, Part 2 - Practice and Philosophy](https://blog.isquaredsoftware.com/2017/05/idiomatic-redux-tao-of-redux-part-2/)**
|
---|
94 | > - **[Redux FAQ](https://redux.js.org/faq)**
|
---|
95 |
|
---|
96 | ## Basic Example
|
---|
97 |
|
---|
98 | The whole global state of your app is stored in an object tree inside a single _store_.
|
---|
99 | The only way to change the state tree is to create an _action_, an object describing what happened, and _dispatch_ it to the store.
|
---|
100 | To specify how state gets updated in response to an action, you write pure _reducer_ functions that calculate a new state based on the old state and the action.
|
---|
101 |
|
---|
102 | Redux Toolkit simplifies the process of writing Redux logic and setting up the store. With Redux Toolkit, the basic app logic looks like:
|
---|
103 |
|
---|
104 | ```js
|
---|
105 | import { createSlice, configureStore } from '@reduxjs/toolkit'
|
---|
106 |
|
---|
107 | const counterSlice = createSlice({
|
---|
108 | name: 'counter',
|
---|
109 | initialState: {
|
---|
110 | value: 0
|
---|
111 | },
|
---|
112 | reducers: {
|
---|
113 | incremented: state => {
|
---|
114 | // Redux Toolkit allows us to write "mutating" logic in reducers. It
|
---|
115 | // doesn't actually mutate the state because it uses the Immer library,
|
---|
116 | // which detects changes to a "draft state" and produces a brand new
|
---|
117 | // immutable state based off those changes
|
---|
118 | state.value += 1
|
---|
119 | },
|
---|
120 | decremented: state => {
|
---|
121 | state.value -= 1
|
---|
122 | }
|
---|
123 | }
|
---|
124 | })
|
---|
125 |
|
---|
126 | export const { incremented, decremented } = counterSlice.actions
|
---|
127 |
|
---|
128 | const store = configureStore({
|
---|
129 | reducer: counterSlice.reducer
|
---|
130 | })
|
---|
131 |
|
---|
132 | // Can still subscribe to the store
|
---|
133 | store.subscribe(() => console.log(store.getState()))
|
---|
134 |
|
---|
135 | // Still pass action objects to `dispatch`, but they're created for us
|
---|
136 | store.dispatch(incremented())
|
---|
137 | // {value: 1}
|
---|
138 | store.dispatch(incremented())
|
---|
139 | // {value: 2}
|
---|
140 | store.dispatch(decremented())
|
---|
141 | // {value: 1}
|
---|
142 | ```
|
---|
143 |
|
---|
144 | Redux Toolkit allows us to write shorter logic that's easier to read, while still following the original core Redux behavior and data flow.
|
---|
145 |
|
---|
146 | ## Logo
|
---|
147 |
|
---|
148 | You can find the official logo [on GitHub](https://github.com/reduxjs/redux/tree/master/logo).
|
---|
149 |
|
---|
150 | ## Change Log
|
---|
151 |
|
---|
152 | This project adheres to [Semantic Versioning](https://semver.org/).
|
---|
153 | Every release, along with the migration instructions, is documented on the GitHub [Releases](https://github.com/reduxjs/redux/releases) page.
|
---|
154 |
|
---|
155 | ## License
|
---|
156 |
|
---|
157 | [MIT](LICENSE.md)
|
---|