Skip to content

Releases: reduxjs/react-redux

v7.1.0-alpha.5

20 May 00:31
Compare
Choose a tag to compare
v7.1.0-alpha.5 Pre-release
Pre-release

We're still making changes to our hooks APIs, but I'm hopeful that we're getting close to having the behavior nailed down.

This release makes three specific changes to useSelector:

  • The deps array has been removed. If you want to ensure the same selector function reference is used, you should memoize it yourself.
  • The default equality check used to determine if a re-render is needed is now a strict === check, instead of a shallow equality check.
  • useSelector now accepts a comparison function as an optional second argument, similar to how React.memo() works conceptually. You may pass your own comparison function to customize how useSelector determines if a re-render is necessary.

In addition, we now export our internal shallowEqual utility function. If you want to return to the prior equality behavior, you may pass that as the equality comparison function:

import { shallowEqual, useSelector } from "react-redux"

// later
const selectedData = useSelector(mySelector, shallowEqual)

The optional comparison function also enables using something like Lodash's _.isEqual() or Immutable.js's comparison capabilities.

Changes

v7.1.0-alpha.4

01 May 05:43
Compare
Choose a tag to compare
v7.1.0-alpha.4 Pre-release
Pre-release

Our previous alpha versions included both useSelector() (similar to mapState) and useActions() (similar to mapDispatch).

However, Dan Abramov strongly suggested that we consider removing useActions(), as the idea of "binding action creators" is less relevant when using hooks, and also adds conceptual overhead and syntactic complexity. We requested feedback from alpha users, and the initial feedback agreed with Dan's suggestion.

Based on that feedback, v7.1.0-alpha.4 removes the useActions() hook. Instead, call useDispatch() in your component, and manually call dispatch(someActionCreator()) in callbacks and effects as needed.

If you still wish to use useActions(), the hooks alpha docs page has an implementation you can copy and paste into your own code.

Changes

v7.1.0-alpha.3

28 Apr 16:54
Compare
Choose a tag to compare
v7.1.0-alpha.3 Pre-release
Pre-release

After discussion in the hooks alpha feedback issue, we've decided to remove the useRedux() hook, as it doesn't really bring any benefits. If you were using it in your own code, replace the useRedux() call with separate calls to useSelector() and useActions().

This release also includes the timing bugfix from #1263.

Also, while you won't notice it, @mpeyper was able to simplify our hooks unit tests using react-hooks-testing-library.

Changes

  • Remove useRedux hook 8c0750c
  • fix timing issue in component updates due to consecutive dispatches (#1263 by @MrWolfZ)
  • Use react-hooks-testing-library to test hooks (#1259 by @mpeyper)

v7.0.3

28 Apr 16:40
Compare
Choose a tag to compare

This release includes a bugfix for a timing issue in connect(), and also lowers our React peer dependency slightly to allow better usage with React Native 0.59.

Changes

v7.1.0-alpha.1

22 Apr 19:42
Compare
Choose a tag to compare
v7.1.0-alpha.1 Pre-release
Pre-release

React hooks are cool. All the cool kids are adding hooks to their libraries. We wanna be cool too.

That's why React Redux now includes a set of hooks you can use as an alternative to connect()!

npm i react-redux@next
yarn add react-redux@next

This alpha release includes the following hooks:

  • useSelector(): extracts values from the Redux store state and subscribes to the store (similar to mapState)
  • useActions(): binds action creators so that they dispatch actions when called (similar to mapDispatch)
  • useRedux(): both extracts values and binds action creators (similar to connect())
  • useDispatch(): returns the store dispatch method
  • useStore(): returns the Redux store instance

For more details, please see the "Hooks" API reference page under the "next" version section of the React Redux docs. In addition, issue #1179: Discussion: Potential hooks API design contains the history of how these APIs were designed.

Please try these hooks out in your own apps, and give us feedback on how well they work!

We've opened up issue #1252 as a thread for feedback and discussion of the alpha.

Note: The hook APIs listed in this page are still experimental and in alpha! Try them out, but be aware that they may be changed before a final release, including potential renaming or removal.

Changes

Contributors

Thanks to:

  • @MrWolfZ for creating a proof-of-concept library for these hooks, turning that library into the core implementation PR, and helping work through a ton of edge cases and issues
  • everyone who built an unofficial Redux hooks library, particularly @ianobermiller and @epeli
  • everyone who helped brainstorm and refine ideas in #1063 and #1179

v7.1.0-alpha.0

22 Apr 05:47
Compare
Choose a tag to compare
v7.1.0-alpha.0 Pre-release
Pre-release

Initial alpha hooks release. See the release notes for v7.1.0-alpha.1 for details.

v7.0.2

12 Apr 20:28
8853327
Compare
Choose a tag to compare

This is a bug fix release with a small performance improvement and fix for nested component unmounting.

Changes

  • Memoize renderedWrappedComponent separately (#1234 by @vzaidman)
  • Fix timing issue with setting up store subscription inside a connected component (#1235 by @MrWolfZ)

v7.0.1

09 Apr 04:14
Compare
Choose a tag to compare

React-Redux version 7 resolves the performance issues that were reported with version 6, and lays the groundwork for us to design and ship a public useRedux()-type Hooks API in a later 7.x release.

The major change for this release is that connect is now implemented using Hooks internally. Because of this, we now require a minimum React version of 16.8.4 or higher.

This release has undergone extensive performance benchmarking, and we're confident that it's the fastest version of React-Redux yet! We've also expanded our test suite to cover a number of additional use cases and scenarios.

npm install react-redux@latest

For discussion on the reasons for the major version change and the development process, see:

issue #1177 - React-Redux Roadmap: v6, Context, Subscriptions, and Hooks.

For discussion on the possible design of a future public hooks API, see:

issue #1179: Discussion: Potential hooks API design

Changes

This release should be public-API-compatible with version 6. The only public breaking change is the update of our React peer dependency from 16.4 to 16.8.4.

Note: connect now uses React.memo() internally, which returns a special object rather than a function. Any code that assumed React components are only functions is wrong, and has been wrong since the release of React 16.6. If you were using PropTypes to check for valid component types, you should change from PropTypes.func to PropTypes.elementType instead.

Internal Changes

Direct Component Subscriptions

In v6, we switched from individual components subscribing to the store, to having <Provider> subscribe and components read the store state from React's Context API. This worked, but unfortunately the Context API isn't as optimized for frequent updates as we'd hoped, and our usage patterns led to some folks reporting performance issues in some scenarios.

In v7, we've switched back to using direct subscriptions internally, which should improve performance considerably.

(This does result in some changes that are visible to user-facing code, in that updates dispatched in React lifecycle methods are immediately reflected in later component updates. Examples of this include components dispatching while mounting in an SSR environment. This was the behavior through v5, and is not considered part of our public API.)

Batched Updates

React has an unstable_batchedUpdates API that it uses to group together multiple updates from the same event loop tick. The React team encouraged us to use this, and we've updated our internal Redux subscription handling to leverage this API. This should also help improve performance, by cutting down on the number of distinct renders caused by a Redux store update.

connect Rewritten with Hooks

We've reimplemented our connect wrapper component to use hooks internally. While it may not be visible to you, it's nice to know we can take advantage of the latest React goodies!

Public API Changes

Return of store as a Prop

We've brought back the ability to pass a store as a prop directly to connected components. This was removed in version 6 due to internal implementation changes (components no longer subscribed to the store directly). Some users expressed concerns that working with context in unit tests was not sufficient. Since our components use direct subscriptions again, we've reimplemented this option, and that should resolve those concerns.

New batch API for Batched React Updates

React's unstable_batchedUpdate() API allows any React updates in an event loop tick to be batched together into a single render pass. React already uses this internally for its own event handler callbacks. This API is actually part of the renderer packages like ReactDOM and React Native, not the React core itself.

Since React-Redux needs to work in both ReactDOM and React Native environments, we've taken care of importing this API from the correct renderer at build time for our own use. We also now re-export this function publicly ourselves, renamed to batch(). You can use it to ensure that multiple actions dispatched outside of React only result in a single render update, like this:

import { batch } from "react-redux";

function myThunk() {
    return (dispatch, getState) => {
        // should only result in one combined re-render, not two
        batch(() => {
            dispatch(increment());
            dispatch(increment());
        })
    }
}

If you are using an alternative React renderer, like the Ink CLI renderer, that method isn't available for us to import. In that case, you will need to change your code to import from the new react-redux/es/alternate-renderers entry point instead. (Use react-redux/lib/alternate-renderers for the CJS version). That entry point exports a no-op version of batch() that just executes the callback immediately, and does not provide React batching.

In that situation, you may want to consider aliasing react-redux to one of those alternate entry points in your build tool for the best compatibility, especially if you're using any other libraries that depend on React-Redux.

Note: v7.0.1 is identical code-wise to v7.0.0 . The extra patch release was to update the React requirement listed in the README.

Contributors

Thanks to:

v7.0.0

12 Apr 20:25
Compare
Choose a tag to compare

Initial release, but we missed some updated docs. Ignore this 😄

v7.0.0-beta.0

22 Mar 04:19
Compare
Choose a tag to compare
v7.0.0-beta.0 Pre-release
Pre-release

React-Redux version 7 resolves the performance issues that were reported with version 6, and lays the groundwork for us to design and ship a public useRedux()-type Hooks API in a later 7.x release.

The major change for this release is that connect is now implemented using Hooks internally. Because of this, we now require a minimum React version of 16.8.4 or higher.

This release has undergone extensive performance benchmarking, and we're confident that it's the fastest version of React-Redux yet! We've also expanded our test suite to cover a number of additional use cases and scenarios. Now we need the community to help us make sure it's good to go. Please test this out in your applications and give us feedback in PR #1209. We're especially interested in info on any performance or feature regressions, but we also would appreciate hearing "tried it in our app, and it works great!" feedback as well.

npm install react-redux@next

For discussion on the reasons for the major version change and the development process, see:

issue #1177 - React-Redux Roadmap: v6, Context, Subscriptions, and Hooks.

Changes

This release should be public-API-compatible with version 6. The only public breaking change is the update of our React peer dependency from 16.4 to 16.8.4.

Internal Changes

Direct Component Subscriptions

In v6, we switched from individual components subscribing to the store, to having <Provider> subscribe and components read the store state from React's Context API. This worked, but unfortunately the Context API isn't as optimized for frequent updates as we'd hoped, and our usage patterns led to some folks reporting performance issues in some scenarios.

In v7, we've switched back to using direct subscriptions internally, which should improve performance considerably.

(This does result in some changes that are visible to user-facing code, in that updates dispatched in React lifecycle methods are immediately reflected in later component updates. Examples of this include components dispatching while mounting in an SSR environment. This was the behavior through v5, and is not considered part of our public API.)

Batched Updates

React has an unstable_batchedUpdates API that it uses to group together multiple updates from the same event loop tick. The React team encouraged us to use this, and we've updated our internal Redux subscription handling to leverage this API. This should also help improve performance, by cutting down on the number of distinct renders caused by a Redux store update.

connect Rewritten with Hooks

We've reimplemented our connect wrapper component to use hooks internally. While it may not be visible to you, it's nice to know we can take advantage of the latest React goodies!

Public API Changes

Return of store as a Prop

We've brought back the ability to pass a store as a prop directly to connected components. This was removed in version 6 due to internal implementation changes (components no longer subscribed to the store directly). Some users expressed concerns that working with context in unit tests was not sufficient. Since our components use direct subscriptions again, we've reimplemented this option, and that should resolve those concerns.

New batch API for Batched React Updates

React's unstable_batchedUpdate() API allows any React updates in an event loop tick to be batched together into a single render pass. React already uses this internally for its own event handler callbacks. This API is actually part of the renderer packages like ReactDOM and React Native, not the React core itself.

Since React-Redux needs to work in both ReactDOM and React Native environments, we've taken care of importing this API from the correct renderer at build time for our own use. We also now re-export this function publicly ourselves, renamed to batch(). You can use it to ensure that multiple actions dispatched outside of React only result in a single render update, like this:

import { batch } from "react-redux";

function myThunk() {
    return (dispatch, getState) => {
        // should only result in one combined re-render, not two
        batch(() => {
            dispatch(increment());
            dispatch(increment());
        })
    }
}

If you are using an alternative React renderer, like the Ink CLI renderer, that method isn't available for us to import. In that case, you will need to change your code to import from the new react-redux/es/alternate-renderers entry point instead. (Use react-redux/lib/alternate-renderers for the CJS version). That entry point exports a no-op version of batch() that just executes the callback immediately, and does not provide React batching.

In that situation, you may want to consider aliasing react-redux to one of those alternate entry points in your build tool for the best compatibility, especially if you're using any other libraries that depend on React-Redux.

Contributors

Thanks to: