Skip to content

Releases: reduxjs/react-redux

v7.2.2

26 Oct 22:57
1df5622
Compare
Choose a tag to compare

This release allows you to use React Redux with React 17 without a warning when installing. That's about it.

Changes

v7.2.1

25 Jul 19:25
Compare
Choose a tag to compare

This release improves useSelector value display in the React DevTools, fixes a potential race condition, and fixes a couple additional minor issues.

useSelector DevTools Display

The React DevTools normally show custom hooks with their inspected name (such as "Selector" for useSelector), and any calls to core hooks inside. This is not always informative, so React has the useDebugValue hook to allow custom hooks to specify what value should be shown instead.

useSelector now calls useDebugValue to specifically show the current selected value instead of its internal hooks usage.

Bug Fixes

This release has a few different bug fixes:

  • A potential race condition when dispatching actions from child components in the commit phase vs selecting data in a parent
  • Removed an excess new object creation when forcing a re-render
  • Our internal prop name for a forwarded ref is now reactReduxForwardedRef to avoid a rare situation where someone else might be passing down a field named forwardedRef
  • Fixed a typo in a useSelector error message

Changes

  • Fix error message typo in useSelector ('You must pass a selector...). (@Pixelwelder - #1581)
  • fix useSelector race condition with memoized selector when dispatching in child components useLayoutEffect as well as cDM/cDU (@dai-shi - #1536)
  • removed a redundant object creation when using forceUpdate (@vzaidman - #1567)
  • Rename internal forwardedRef usage (@dtschust - #1553)
  • Show useSelector result in React DevTools (@Finesse - #1530)

v7.2.0

18 Feb 04:06
Compare
Choose a tag to compare

This release fixes two bugs, an algorithmic problem with unsubscribing components and a memory leak with connect. It also has optimizations for production bundle size, and adds a couple small improvements to developer readability while debugging.

Bug Fixes

connect in v7 is implemented using hooks, and the hooks usage captures numerous values from the surrounding scope. We received a PR informing us that the way we were capturing these values would likely result in a copy of the first version of its props being kept alive indefinitely.

This memory leak has been fixed by extracting a custom hook that receives all the necessary values as arguments, so that they're not captured via closure.

We also received a PR letting us know that the unsubscribe logic had a quadratic algorithm in it, as removing a subscriber would use an indexOf(listener) check to remove that callback. If there were a large number of subscribers, that line's runtime would increase rapidly, causing slowdowns.

This algorithm has been replaced with tracking subscribers via a linked list, which drastically improves the runtime of this section of the code even with large numbers of subscribers.

Thanks to @larrylin28 and @wurstbonbon for finding these bugs and submitting PRs to fix them!

Bundle Size Improvements

We've made a number of small tweaks to the codebase to improve the ability of bundlers to shake and minimize the final included size in a bundle. The net result is that react-redux@7.2.0 is smaller than 7.1.3, dropping 1.3K min and 0.6K min+gzip. (In fact, it's even smaller than the pre-hooks 7.0.0 when gzipped!)

Thanks to @Andarist for doing most of the work on this!

Debugging Improvements

The ReactReduxContext instance now has a displayName set, so it should show up in the React DevTools as ReactRedux.Provider.

Also, when an error is caught in useSelector and re-thrown, we now append the original stack trace.

Thanks to @pieplu and @r3dm1ke for these!

Changes

v7.1.3

06 Nov 04:03
Compare
Choose a tag to compare

Forgot to remove a console statement before I published 7.1.2. Oops!

Lint your source code before publishing, folks.

Changes

v7.1.2

06 Nov 03:21
Compare
Choose a tag to compare

This releases fixes a subtle timing bug with connect and useSelector in React Native environments, and adds the ability to pass through non-Redux-store values as a store prop.

Fixed Store Subscriptions in React Native

Our current implementation requires cascading updates down through connected components. This is primarily done during React's "commit phase" via the useLayoutEffect hook. Unfortunately, React warns when useLayoutEffect is called in SSR environments, so we try to feature-detect that and fall back to useEffect just to avoid that warning.

Unfortunately, a tweak to the feature detection conditions during the pre-7.1.0 work caused the check to accidentally fail in React Native environments. This meant that useEffect was actually being used all the time, and this led to occasional timing bugs such as #1313 and #1437 . This affected the previous v7.1.x releases.

We've fixed that issue, and added additional test cases to ensure that our code works correctly under React Native.

See #1444 for more details on the feature detection and the fix.

Passing Through Non-Store Values

connect has always accepted passing a Redux store directly to connected components as a prop named store (with the exception of v6). As a result, the store prop has effectively been treated as a "reserved" prop, in much the same way that key and ref are "reserved" prop names handled by React.

Some users may be using the word "store" to describe their domain data, and have asked to allow variables that aren't a Redux store through the store prop to the component (#1393). We've finally been able to implement that capability.

Changes

v5.1.2

08 Oct 20:13
4be2626
Compare
Choose a tag to compare

Changes

  • Bump up hoist-non-react-statics version (@timdorr)
  • Avoid warnings in React >=16.3 (#1410 by @samkline)
  • Use UNSAFE_ lifecycle event names where supported (#1383 by @elyobo)

v7.1.1

26 Aug 01:53
65d7935
Compare
Choose a tag to compare

This release includes some new APIs for those that want to use a custom React Context with our Hooks API, a small memory optimization, and has a fix for when the store changes on a Provider with incompatible children.

Changes

v7.1.0

11 Jun 02:11
01966db
Compare
Choose a tag to compare

Hooks!

After much discussion, we've decided these Hook things are probably going to stick around, so we might as well add some. Many thanks to @MrWolfZ, @josepot, @perrin4869, and @mpeyper for their contributions and to everyone else that offered feedback, ideas, and critiques as we built them out. Go open source!

Changes

v7.1.0-rc.1

30 May 01:54
6e9b44b
Compare
Choose a tag to compare
v7.1.0-rc.1 Pre-release
Pre-release

⚠️We've got RC sign! ⚠️

This version is essentially the same as the previous 7.1.0-alpha.5 release. But it has an rc tag on it, so you can more easily justify the upgrade to your manager.

Get to it!

npm install react-redux@next

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