React Router in Hilla
The file router of Hilla is built on top of React Router, a popular routing library for React applications. This article describes the details of the router integration, and provides instructions for customizing the route mapping.
React Router Configuration
In cases when file-based routing is not applicable, it is possible to declare views manually in the route mapping, which is described below.
The route mapping is managed through a source file called routes.tsx
. This file defines the application’s routes, including the components associated with each.
The file defining the route mapping is located in the project’s src/main/frontend
directory. When this file is missing, a default template is generated and used in the src/main/frontend/generated
directory. You can copy the generated file to the src/main/frontend
directory and use it as a base for creating a custom route mapping.
The RouterConfigurationBuilder
utility provides an API for configuring the React Router. Here’s an example of how the builder API could be used in the routes.tsx
file:
import { RouterConfigurationBuilder } from '@vaadin/hilla-file-router/runtime.js';
import Flow from 'Frontend/generated/flow/Flow';
import fileRoutes from 'Frontend/generated/file-routes.js';
import MainLayout from 'Frontend/explicit-routes/MainLayout.js';
import HillaView from 'Frontend/explicit-routes/HillaView.js';
import Login from 'Frontend/explicit-routes/Login.js';
export const { router, routes } = new RouterConfigurationBuilder()
.withFileRoutes(fileRoutes) // (1)
.withReactRoutes( // (2)
[
{
element: <MainLayout />,
handle: { title: 'Main' },
children: [
{ path: '/hilla', element: <HillaView />, handle: { title: 'Hilla' } }
],
},
{ path: '/login', element: <Login />, handle: { title: 'Login' } }
]
)
.withFallback(Flow) // (3)
.protect('/login') // (4)
.build(); // (5)
-
The
.withFileRoutes()
method enables routes collected by the Hilla file router. -
The
.withReactRoutes()
method adds custom React Router routes by merging them with the hierarchy above. In this example, the custom routes are added after the file routes. The<HillaView />
view component is mapped to the/hilla
path inside the main layout, and the/login
route is defined to show the<Login />
view outside the main layout. -
The
.withFallback()
method allows to map a component as a fallback route, which handles the case when none of the routes above match. In this example, as well as by default, theFlow
component acts as a fallback, which enables navigation to the Flow Java views on the server side. -
The
.protect()
method wraps enables client-side view authorization. In this example, the/login
path is defined as a redirect target for unauthorized navigation attempts. -
The
.build()
method finalizes the builder setup and returns the object with therouter
instance and theroutes
. It is used to define exports in theroutes.tsx
file.
The router instance exported from this file is then used in the index.tsx
file to render the application.