[d24f17c] | 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)
|
---|