Allows current and previous route to exist enabling page transition animations.
Sometimes you need to show transitions between page routes but Blazor, by default, only allows one. This Razor component library provides the ability to remember the last route and allows you to perform transitions out and in, on the old and new route views. You can also use this information to contextually perform different transitions based on the route page types being transitioned.
- .NET 6 (and prior .net standard 2.1 using v3.1.0 or before)
- Two transition implementation options; Blazor coded or jsInterop
- Transition data provided allowing different transitions based on context
- Optionally remember previous page state
- Works with browser navigation history, forward and back
- Very simple to use, only a couple of file changes required
Install-Package BlazorTransitionableRoute
or
dotnet add package BlazorTransitionableRoute
Add reference to _Imports.razor file
@using BlazorTransitionableRouteAdd registrations for the dependency injection framework in Program.cs, for example
builder.Services.AddScoped<BlazorTransitionableRoute.IRouteTransitionInvoker, MyRouteTransitionInvoker>();Or BlazorTransitionableRoute.DefaultRouteTransitionInvoker if you implement transitions via Blazor code and not via jsInterop.
You will need to change App.razor to use the newly provided TransitionableRoutePrimary/Secondary components
Modify the App.razor file
Modify the App.razor file to take advantage of the transitionable route layouts and view. This means moving the MainLayout to be more explicit in the app router and providing a more container like MyViewLayout as the default layouts. You can see below the simple use of primary and secondary route views. The TransitionableRoutePrimary / Secondary modify the RouteData passed to each inner TransitionableRouteView based on the active state, which is swapped after each navigation to preserve component instances.
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<LayoutView Layout="@typeof(MainLayout)">
<TransitionableRoutePrimary RouteData="@routeData" ForgetStateOnTransition="true">
<TransitionableRouteView DefaultLayout="@typeof(MyViewLayout)" />
</TransitionableRoutePrimary>
<TransitionableRouteSecondary RouteData="@routeData" ForgetStateOnTransition="true">
<TransitionableRouteView DefaultLayout="@typeof(MyViewLayout)" />
</TransitionableRouteSecondary>
</LayoutView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>Create your own transitiong view
This example code shows the Blazor coded implementation. For jsInterop see the example usage section below.
@inherits TransitionableLayoutComponent
<div class="@transitioningClass">
@Body
</div>
@code {
private string transitioningDirection => Transition.Backwards ? "Up" : "Down";
private string transitioningClass => Transition.FirstRender ? "" : Transition.IntoView
? $"animate__fadeIn{transitioningDirection} animate__faster animate__animated"
: $"animate__fadeOut{transitioningDirection} animate__faster animate__animated";
}Transition parameter is provided by the inherited TransitionableLayoutComponent
Notes on usage
- This library does not provide animation styles, it simply provides the means to hook into how and when to trigger them.
- If you need to remember page state, to keep track of scroll position for example, you will need to set
ForgetStateOnTransitiontofalse- If so, depending on your transition library used, you will need to use z-order, pointer-events, offset position, or other means, of the layout views to cope with interacting with the current route where the switched route is still present but hidden.
- If you need to handle in-app back buttons then use the jsInterop to call the native back i.e.
window.history.back(); - If you use
AuthorizeRouteViewthen you will have to create you own razor component similar toTransitionableRouteViewand consume in theApp.razorfile. See the 'Example Usage' section below for details.
The library provides a simple set of properties to aid you in adding transitions to your projects.
The TransitionableLayoutComponent, which you may inherit, providing
TransitionpropertiesIntoView- true, if the route should be made visibleBackwards- true, if you want to reverse animations, for instanceFirstRender- true, if you want to stop transitioning because of first loadRouteDatareference data you may like to useSwitchedRouteDatareference data you may like to use
TransitionTypea tuple property to allow custom transitions based on what is being transitionedfromTypeis the previous routePageTypetoTypeis the active routePageType
There is also IRouteTransitionInvoker that you implement when using jsInterop for transitions
InvokeRouteTransitionAsync- provides theTransitionparameter and where you invoke JS interop.
You can find detailed documentation on example usage here
These demos show examples of the Blazor coded transition option (for the Javascript interop transition option, see the detailed documentation mentioned above).
- The
BlazorTransitionableRouteDemoWasmdemo for WebAssembly Apps. see commit for implementation details- For
AuthorizeRouteViewchanges see this commit
- For
- The
BlazorTransitionableRouteDemoServerdemo for Server Apps. see commit for implementation details- For
AuthorizeRouteViewchanges see this commit
- For
- Version 4.0.0 .NET 6 component, previously .NET Standard 2.1.
- Version 3.1.0 - previous documentation
- Addition of
TransitionDurationMillisecondsto clear switched route view after transition. Only whenForgetStateOnTransitionis set to true.
- Addition of
- Version 3.0.0 - previous documentation
- Implemented new
Transition.SwitchedRouteDataalong withTransition.RouteDatato provide means to perform custom transitions. i.e. parent/child views.
- Implemented new
- Version 2.1.0 - previous documentation and v3 breaking changes
- Addition of
ForgetStateOnTransitionoption to reset page state when returning to previous route via navigation.
- Addition of
- Version 2.0.0 - previous documentation
- Simplified implemention and usage
- Transitions can now also be done via Blazor code as well as jsInterop
- Adjust transition behaviour on first render via
Transition.FirstRender - Get the transition direction from
Transition.Backwards
- Version 1.0.0 - documentation and v2 breaking changes
- Check behaviour for slow loaded pages and handle transition when in ready state or suggest best practice for pages that exhibit this.
- Make
ForgetStateOnTransitionconfigurable to specific page types - Potentially move increasing numbers of parameter settings to configuration options
- Remember scroll positions and set when transition.
