Releases: reduxjs/react-redux
v7.2.3
This release improves behavior in useSelector
by returning the existing reference if the newly returned selector result passes the equality check, and adds a hard dependency on the @types/react-redux
package to ensure TS users always have the typedefs installed.
Changes
useSelector
Results Reuse
Issue #1654 reported that useSelector
was returning new references from a selector even if the equality comparison function returned true
. This is because the equality check was only ever being performed during the action dispatch process.
We now run the equality comparison against the value calculated by the selector while rendering, and return the existing reference for consistency if the old and new values are considered equal. This should improve some cases where further derived values where being recalculated unnecessarily.
TS Types Now Included
React-Redux has always been written in plain JS, and the typedefs maintained by the community in DefinitelyTyped. We plan on eventually rewriting the library in TypeScript in a future React-Redux v8 release, but until then the types can stay in DT.
However, having to always manually install @types/react-redux
is annoying, and some users have gotten confused by that. This release adds a hard dependency on @types/react-redux
, so that if you install react-redux
, you automatically get the types as well. This should simplify the process for TS users.
Docs Updates
We've made several docs updates recently:
- Renamed "Quick Start" to "Getting Started" and "Static Typing" to "Usage with TypeScript"
- Dropped the docs API versioning setup, as the legacy API version docs pages were rarely viewed and the versioning setup confused docs contributors
- Moved the old "Intro > Basic Tutorial" to "Tutorials > Connect" and marked it as semi-obsolete
We are currently working on a new React-Redux tutorial that will teach the React-Redux hooks as the primary approach, based on the "UI and React" page in the Redux docs "Fundamentals" tutorial.
Changelog
- Automatically install @types/react-redux as a dependency (#1699 - @markerikson )
- Reuse latest selected state on selector re-run (#1654) (#1660 - @otakustay)
- Use useIsomorphicLayoutEffect in Provider for consistency (#1683 - @speakingcode )
v7.2.2
v7.2.1
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 namedforwardedRef
- 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
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 [email protected]
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
- Fix memory leak issue with
UseEffect
(@larrylin28 - #1506) - Optimize createListenerCollection (@wurstbonbon - #1523)
- Rethrowing original errors thrown in selector functions (@Andarist - #1474)
- Remove invariant in favor of doing NODE_ENV checks directly (@Andarist - #1472)
- Wrap .propTypes and .displayName assignments with DEV check (@Andarist - #1471)
- Add pure annotations to help with DCE (@timdorr - 5e0c50d)
- Inline this function. (@timdorr - 58ae5ed)
- Add a displayName on ReactReduxContext (@pieplu - #1462)
v7.1.3
Forgot to remove a console
statement before I published 7.1.2. Oops!
Lint your source code before publishing, folks.
Changes
- Remove leftover console statement (@markerikson - 30101bb)
v7.1.2
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
- Pass non-Redux-store values through the
store
prop (@markerikson - #1447) - Fix RN batching and effect behavior (@markerikson - #1444)
- Remove unused
latestStoreState
field (@Hypnosphi - #1426) - Mark the react renderers as optional peer deps. (@timdorr - 388d9e4)
- Use the same condition for checking if SSR in useSelector.js as in connectAdvanced.js (@LeoDanielsson - #1419)
v5.1.2
v7.1.1
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
- Add
create*Hook
factory APIs (#1309 by @ryaninvents) - Free resources (free detached nodes from memory) (#1380 by @MosheZemah)
- Convert Provider into function component with hooks (#1377 by @mpeyper)
v7.1.0
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
- Add React Hooks (#1248 by @MrWolfZ)
- Add
deps
argument touseSelector
(#1251 by @MrWolfZ) - Use react-hooks-testing-library to test hooks (#1259 by @mpeyper)
- Remove
useRedux
(@markerikson) - Remove
useActions
(@markerikson) - Remove
deps
argument (#1272 by @josepot) - Replace
shallowEqual
with reference equality inuseSelector
(#1288 by @perrin4869) - Avoid unnecessary selector evaluations (#1273 by @josepot)
- Minor Hook testing improvements (#1294 by @MrWolfZ)
v7.1.0-rc.1
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