Skip to main content

Links and Navigation

Link - main component for tramvai router navigations inside React components.

By default, Link will render <a> as a children. You can change this by passing a React component as a children - passed component should accept props href, onClick that should be used in order to make the navigation.

Example:

import { Link } from '@tramvai/module-router';
import CustomLink from '@any-ui-kit/link';

export const WrappedCustomLink = () => {
return (
<Link url="/test/">
<CustomLink />
</Link>
);
};

export const DefaultLink = () => {
return <Link url="/test/">Click me</Link>;
};
tip

Consider to use View Transitions API to animate your navigations

Page resources prefetch​

Link component will try to prefetch resources for passed url, if this url is handled by the application router.

It will help to make subsequent page-loads faster because target page assets already be saved in browser cache.

info

Your passed component need to be wrapped in the forwardRef for routes assets prefetching

How it works:

  • Component determines when it is in the viewport (using Intersection Observer)
  • waits until the browser is idle (using requestIdleCallback)
  • checks if the user isn't on a slow connection (using navigator.connection.effectiveType) or has data-saver enabled (using navigator.connection.saveData)
  • triggers page resources (js, css) prefetching

Main reference for this feature - quicklink library.

If you want to disable this behaviour, pass prefetch={false} property.

export const WrapLink = () => {
return (
<Link url="/test/" prefetch={false}>
Click me
</Link>
);
};

useNavigate() Hook​

useNavigate hook - another way to make navigation from React component.

By default, useNavigate returns a function, which can be called with any url (string or NavigateOptions object):

import { useNavigate } from '@tramvai/module-router';

export const Page = () => {
const navigate = useNavigate();

return (
<button type="button" onClick={() => navigate('/test/')}>
Navigate to /test/
</button>
);
};

Also, you can create a navigation callback with predefined parameters:

import { useNavigate } from '@tramvai/module-router';

export const Page = () => {
const navigateToTest = useNavigate({ url: '/test/', query: { a: '1', b: '2' } });

return (
<button type="button" onClick={navigateToTest}>
Navigate to /test/
</button>
);
};

PageService Service​

PageService - is a wrapper for working with tramvai router. Serves to hide routing internals and is the preferred way of working with router. Available via PAGE_SERVICE_TOKEN token.

This service is intended for use in DI providers and actions.

navigate(url) method make a navigation to a new page and accept target url as argument (string or NavigateOptions object):

import { provide, commandLineListTokens } from '@tramvai/core';
import { PAGE_SERVICE_TOKEN } from '@tramvai/module-router';

const provider = provide({
provide: commandLineListTokens.resolvePageDeps,
useFactory: ({ pageService }) => {
return function redirect() {
if (pageService.getCurrentUrl().pathname === '/test/') {
return pageService.navigate({ url: '/redirect/', replace: true });
}
};
},
deps: {
pageService: PAGE_SERVICE_TOKEN,
},
});

Route Update​

updateCurrentRoute(options) method updates the current route without page reload with new parameters (BaseNavigateOptions object), for example you can change query parameters:

import { provide, declareAction } from '@tramvai/core';
import { PAGE_SERVICE_TOKEN } from '@tramvai/module-router';

const action = declareAction({
name: 'action',
fn() {
const { pageService } = this.deps;

if (pageService.getCurrentUrl().pathname === '/test/') {
return pageService.updateCurrentRoute({ query: { a: '1', b: '2' } });
}
},
deps: {
pageService: PAGE_SERVICE_TOKEN,
},
});

History Back​

type HistoryOptions = {
historyFallback: string;
replace?: boolean;
};

back(options?: HistoryOptions) method will go back through history

  • historyFallback - optional url for navigation. It is navigated to passed url only if browser history is empty.
  • replace - whether the passed historyFallback url will be replaced in the browser history or added to the history.

History Forward​

forward() method will go forward through history

History Go​

go(to) method will go to the specified delta by history

Extract previous route url​

To extract information about the previous route, you can use window.history.state.navigateState. This object will always have information about the previous URL and the previous route's navigation state.

interface PreviousNavigateState {
previousRoute?: Route;
previousUrl?: Url;
}

Object that allows to specify transition options both to navigate and updateCurrentRoute transitions:

  • code - redirect code that is returned on server in case of redirects
  • navigateState - any additional data that is stored with route