react-redux - Redux的官方React绑定
react-redux - Redux的官方React绑定This release is sponsored by Deft, providing technical teams to high-growth SaaS companies with the processes they need to scale successfully. Please reach out to see how we can help with your software development, systems architecture, and infrastructure design needs.
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)
P.S. On the sponsorship section above, it's a thing we're trying out to see how it feels and if it causes any problems for your workflows. (Don't worry, no ads are coming to your npm installs!) The idea for future releases is to let those that contributed to that release have the opportunity to sponsor that release. We don't need donations, but we definitely do need PRs! Hopefully, it's a fair way to encourage them. Please let us know if it's a problem in any way.
Assets
2
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)
Assets
2
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
Assets
2
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 howReact.memo()
works conceptually. You may pass your own comparison function to customize howuseSelector
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
Assets
2
markerikson released this
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:
- Remove useActions ( 54fd9dd )
Assets
2
markerikson released this
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 tomapState
)useActions()
: binds action creators so that they dispatch actions when called (similar tomapDispatch
)useRedux()
: both extracts values and binds action creators (similar toconnect()
)useDispatch()
: returns the storedispatch
methoduseStore()
: 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
Assets
2
This is a bug fix release with a small performance improvement and fix for nested component unmounting.
Changes
Assets
2
markerikson released this
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 usesReact.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 fromPropTypes.func
toPropTypes.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:
- @markerikson for the writeup in #1177 and the primary implementation work on version 7
- @Ephem, @saboya, @maxkostow, @MrWolfZ for contributing unit tests and critiques
- @Andarist for some perf tweaks
- @migueloller, @alexreardon, @luskin, @navneet-g, and @josepot for diagnosing edge cases, working with us to debug them, and coming up with fixes
- @wgao19 for adding API versioning to the docs site
- everyone else who helped give feedback in the issues and beta testing
Assets
2
markerikson released this
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 let us know if there are big performance or feature regressions.
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:
- @markerikson for the writeup in #1177 and the primary implementation work on version 7
- @Ephem, @saboya, @maxkostow, @MrWolfZ for contributing unit tests and critiques
- @Andarist for some perf tweaks
- @migueloller and @alexreardon for diagnosing edge cases, working with us to debug them, and coming up with fixes
Assets
2
timdorr released this
- Update hoist-non-react-statics to 3.x
Assets
2
This is a minor release with support for react-hot-loader and a few small bug fixes for edge cases.
While you're here, please stop by #1177 to see our roadmap for the next versions of React Redux. We are aware that performance is not so hot in 6.0. Short version: We put too much traffic on React's context API, which isn't really designed for high levels of reads and writes. We're looking to reduce that load and get performance back on track in a minor release, so there won't be backwards compatibility concerns. We have a new extensive benchmark suite to keep us on track and ensure we're not regressing on speed in the future.
And yes, we know about Hooks. Check out #1179.
Changes
- Fix for circular component object structures, such as Emotion styled components. (#1122 by @Andarist)
- Minor optimization: remove conditional (#1131 by @ericanderson)
- Ensure that component
context
prop really contains a React context (#1134 by @casdevs) - react-hot-loader compatibility (#1168/#1137 by @theKashey)
- Upgrade to react-is v16.7.0 (#1174 by @nobezawa)
Assets
2
Assets
2
As such, we now require React 16.4 or higher. Make sure to update your version when updating to this release.
This work has been mostly lead by @cellog and @markerikson, with special guest appearances by yours truly and a whole cast of helpful reviewers.
Note: If you'd like to know more about the changes in v6, and how the implementation has changed over time, see Mark's post Idiomatic Redux: The History and Implementation of React-Redux.
Breaking Changes
-
The
withRef
option toconnect
has been replaced withforwardRef
. If{forwardRef : true}
has been passed toconnect
, adding a ref to the connected wrapper component will actually return the instance of the wrapped component. (Known issue: Redux Form currently relies onwithRef
.) -
Passing
store
as a prop to a connected component is no longer supported. Instead, you may pass a customcontext={MyContext}
prop to both<Provider>
and<ConnectedComponent>
. You may also pass{context : MyContext}
as an option toconnect
.
Behavior Changes
Any library that attempts to access the store instance out of legacy context will break, because we now put the store state into a <Context.Provider>
instead. Examples of this include connected-react-router
and react-redux-subspace
. (The current implementation does also put the store itself into that same context. While accessing the store in context is not part of our public API, we will still try to make it possible for other libraries to access it, with the understanding that this could break at any time.)
Also, there is a behavior change around dispatching actions in constructors / componentWillMount
. Previously, dispatching in a parent component's constructor would cause its children to immediately use the updated state as they mounted, because each component read from the store individually. In version 6, all components read the same current store state value from context, which means the tree will be consistent and not have "tearing". This is an improvement overall, but there may be applications that relied on the existing behavior.
Changes
- Use React.createContext() (#1000 by @cellog)
- Use Prettier (#1071 by @NMinhNguyen)
- Only run isValidElementType in development builds (#1069 by @alexreardon)
- Treat
null
as a valid plain object prototype inisPlainObject()
(#1075 by @rgrove) - Ensure connectAdvanced only re-renders if derived props change (#1079 by @epeli and @markerikson)
Assets
2
Assets
2
As such, we now require React 16.4 or higher. Make sure to update your version when updating to this release.
This work has been mostly lead by @cellog and @markerikson, with special guest appearances by yours truly and a whole cast of helpful reviewers. While we've had a lot of eyes on this refactor, we need more! Please test this out in your applications and let us know if there are big performance or feature regressions.
npm install react-redux@next
Note: 6.0.0-beta.2 is now on npm. This fixes an incorrect peer dependency for React 16.6 in beta.1.
Breaking Changes
Known major breaking changes:
- The
withRef
option toconnect
has been replaced withforwardRef
. If{forwardRef : true}
has been passed toconnect
, adding a ref to the connected wrapper component will actually return the instance of the wrapped component. (Known issue: Redux Form currently relies onwithRef
.) - Passing
store
as a prop to a connected component is no longer supported. Instead, you may pass a customcontext={MyContext}
prop to both<Provider>
and<ConnectedComponent>
. You may also pass{context : MyContext}
as an option toconnect
.
Also, any library that attempts to access the store instance out of legacy context will break, because we now put the store state into a <Context.Provider>
instead. Examples of this include connected-react-router
and react-redux-subspace
. (The current implementation does also put the store itself into that same context. While accessing the store in context is not part of our public API, we will still try to make it possible for other libraries to access it, with the understanding that this could break at any time.)
Other than those issues, this should be API-compatible with the existing version 5.x line.
Changes
- Use React.createContext() (#1000 by @cellog)
- Use Prettier (#1071 by @NMinhNguyen)
- Only run isValidElementType in development builds (#1069 by @alexreardon)
Assets
2
The biggest fix is for connect()
being used with React's newer forwardRef
, memo
, and lazy
APIs.
We also have begun a complete rewrite of our docs for React Redux. Check them out! Many thanks to those who contributed: @markerikson, @sveinpg, @wgao19, @BTMPL, @pyliaorachel, @dagstuan, @Kerumen, and @carloluis (sorry if I forgot someone!). Docs are a great way to get started contributing to open source, so open a PR today! Check #1001 to see what else needs to be done.
We're also looking at overhauling Redux's documentation. Check out reduxjs/redux#2590 for the latest there.
Changes
- Simplify object check and eliminate lodash dependency (#936 by @matthargett)
- Remove subkey arg (#945 by @theJian)
- Switch our test suite to Jest (@timdorr)
- Implement testing in React 0.14, 15, and 16.x (#984 by @cellog)
- Convert tests to use react-testing-library instead of Enzyme (#998 by @cellog and @markerikson)
- Add unpkg field to package.json (#1003 by @nickmccurdy)
- Set up basic docusaurus structure (#1032 by @sveinpg)
- Add nodejs version 10 for ci (#1058 by @noelyoo)
- Upgrade to babel@7 (#1043 @Andarist)
v5.1.0-test.1
timdorr released this
This is a test release to try out some changes to comply with React 16.3's new StrictMode. Please try it out in your projects and see if it breaks anything!
Changes
- Remove subkey arg (#945 by @theJian)
- Simplify object check and eliminate lodash dependency (#936 by @matthargett)
- Remove usages of async-unsafe lifecycle methods (#919 by @Hypnosphi)
v4.4.9
timdorr released this
- Update hoist-non-react-statics to 2.x
Watchers:450 |
Star:18546 |
Fork:2756 |
创建时间: 2015-07-12 01:32:01 |
最后Commits: 前天 |
许可协议:MIT |
4be2626
Changes