react-router
react-router copied to clipboard
feat: add replace option to loader redirect function
This PR adds the ability to REPLACE
the current history entry rather than always using POP
when redirecting in route loaders.
This is useful for how we manage navigation in Spacedrive:
- Our desktop app supports having multiple tabs, with each tab being its own
MemoryRouter
instance and history stack -
index
routes contain loaders for going from/
to/{libraryId}
to/{libraryId}/{defaultSegment}
, wherelibraryId
is loaded asynchronously anddefaultSegment
is determined based on the result of another asynchronous operation- loaders are used so we can rely on
Suspense
to show the current tab until the new tab's redirects are complete, since loaders + their redirects all run in a single transition
- loaders are used so we can rely on
- The traversal of those
index
routes shouldn't append to the history stack, so that/{libraryId}/{defaultSegment}
is the 0th history entry - Each new tab starts at
/{libraryId}
, so one loader run + one redirect is guaranteed to happen - Currently, each tab automatically has a history stack of length 2 since the redirect that happens is a
PUSH
, not aREPLACE
- Our in-app back button can't disable itself properly as history stack length is always > 1
Allowing loader redirects to REPLACE
rather than PUSH
easily fixes our navigation button problem
🦋 Changeset detected
Latest commit: ca48463dca27d0bc53b2f5c08026a5ea05f1c32e
The changes in this PR will be included in the next version bump.
This PR includes changesets to release 5 packages
Name | Type |
---|---|
@remix-run/router | Minor |
react-router | Patch |
react-router-dom | Patch |
react-router-dom-v5-compat | Patch |
react-router-native | Patch |
Not sure what this means? Click here to learn what changesets are.
Click here if you're a maintainer who wants to add another changeset to this PR
Hi @Brendonovich,
Welcome, and thank you for contributing to React Router!
Before we consider your pull request, we ask that you sign our Contributor License Agreement (CLA). We require this only once.
You may review the CLA and sign it by adding your name to contributors.yml.
Once the CLA is signed, the CLA Signed
label will be added to the pull request.
If you have already signed the CLA and received this response in error, or if you have any questions, please contact us at [email protected].
Thanks!
- The Remix team
Thank you for signing the Contributor License Agreement. Let's get this merged! 🥳
Any updates here, guys? @Brendonovich
@Londeren if it was up to me this would have been merged last year haha
@brookslybrand Any chance you could give this some more visibility within the Remix team to push this over the finish line? This seem to trip up a bunch of people as you can see in https://github.com/remix-run/react-router/discussions/10606
Would be amazing to get this merged 🙏
+1 Would be amazing to get this merged 🙏
+1 We'd also need this, and trying to get some eyes here :pray:
Also hit this too when redirecting in a loader, would be super helpful
+1 we would also like this feature 🙏, because now we need to create a redirect component, which seems like an overkill
+1
This would be so useful for client-only apps
We have the same use-case, but on web as described in the description.
It would be amazing if We could get this merged 🙏
Thank you for the PR @Brendonovich! I talked with @mjackson and we're going to go with a slightly different API here similar to the redirectDocument
precedent we've already set, so we don't have to mess with the ResponseInit
parameter. I'm going to merge this into a branch of mine and I can make the adjustments there and then get it merged.