Like react-router or Next.js file system based route.
Depending on the framework or routing library you are using, links between pages are not handled the same way.
Usually, you'll have a <Link /> component provided by your routing library of choice. You need to let react-dsfr know about it so that whenever a link is needed in a DSFR component, you can provide the correct props for your <Link /> component.
When registering your Link component, its props type will propagate to the react-dsfr API.
This is how you are instructed to set it up by default (no change from the Initial setup guide)
When react-dsfr detects that the href points to an external website it will use a regular <a/> instead of the <Link /> component.
Mailto links
linkProps={{ to:"mailto:contact@code.gouv.fr"}}
Same goes for the mailto links.
Converting a link to a button
linkProps={{ to:"#" onClick: ()=> { /* ... */ }}}
React-dsfr will automatically convert the underlying HTML element into a <button /> that looks like a link for better Accessibility.
Due to the fact that @tanstack/react-router is also implementing module augmentation it's just a tiny bit less straight forward to set up but it works great!
After that you will have type safety on the linkProps, you can use the to property as you would on the react router's <Link /> component!
Note that if you want to link to external website (or use mailto:) you can use the href property instead of the to property (see below).
If you have a link that is a mailto: or a link to an external page, use the href property instead of to. Example:
If you are starting a new project you might want to use TanStack Router in place of react-router as it is, at least in my opignion a much better routing library.
import React from"react";import ReactDOM from"react-dom/client";import { startReactDsfr } from"@codegouvfr/react-dsfr/spa";import { Link } from"react-router-dom";startReactDsfr({ defaultColorScheme:"system", Link });//Only in TypeScript projectsdeclaremodule"@codegouvfr/react-dsfr/spa" {interfaceRegisterLink { Link:typeof Link; }}ReactDOM.createRoot(document.getElementById("root") asHTMLElement).render( <React.StrictMode> {/* ... */} </React.StrictMode>);
Everywhere a DSFR component accepts a xxxLinkProps you are expected to provide an object with a to property because react-router's<Link /> component expects a to prop instead of the typical href.
You can find an example here.