preact-router
Connect your Preact components up to that address bar.
preact-router
provides a <Router />
component that conditionally renders its children when the URL matches their path
. It also automatically wires up <a />
elements to the router.
💁 Note: This is not a preact-compatible version of React Router. preact-router
is a simple URL wiring and does no orchestration for you.
If you're looking for more complex solutions like nested routes and view composition, react-router works great with preact as long as you alias in preact-compat. React Router 4 even works directly with Preact, no compatibility layer needed!
Usage Example
import Router from 'preact-router';
import { h, render } from 'preact';
const Main = () => (
<Router>
<Home path="/" />
<About path="/about" />
<Search path="/search/:query" />
</Router>
);
render(<Main />, document.body);
If there is an error rendering the destination route, a 404 will be displayed.
Handling URLS
:information_desk_person: Pages are just regular components that get mounted when you navigate to a certain URL.
Any URL parameters get passed to the component as props
.
Defining what component(s) to load for a given URL is easy and declarative.
You can even mix-and-match URL parameters and normal props
.
<Router>
<A path="/" />
<B path="/b" id="42" />
<C path="/c/:id" />
<D default />
</Router>
Lazy Loading
Lazy loading (code splitting) with preact-router
can be implemented easily using the AsyncRoute module:
import AsyncRoute from 'preact-async-route';
<Router>
<Home path="/" />
<AsyncRoute
path="/friends"
component={ () => import('./friends') }
/>
<AsyncRoute
path="/friends/:id"
component={ () => import('./friend') }
loading={ () => <div>loading...</div> }
/>
</Router>
Active Matching & Links
preact-router
includes an add-on module called match
that lets you wire your components up to Router changes.
Here's a demo of <Match>
, which invokes the function you pass it (as its only child) in response to any routing:
import Router from 'preact-router';
import Match from 'preact-router/match';
render(
<div>
<Match path="/">
{ ({ matches, path, url }) => (
<pre>{url}</pre>
) }
</Match>
<Router>
<div default>demo fallback route</div>
</Router>
</div>
)
render(
<div>
<Match path="/">
{ ({ matches }) => matches && (
<h1>You are Home!</h1>
) }
</Match>
<Router />
</div>
)
<Link>
is just a normal link, but it automatically adds and removes an "active" classname to itself based on whether it matches the current URL.
import { Router } from 'preact-router';
import { Link } from 'preact-router/match';
render(
<div>
<nav>
<Link activeClassName="active" href="/">Home</Link>
<Link activeClassName="active" href="/foo">Foo</Link>
<Link activeClassName="active" href="/bar">Bar</Link>
</nav>
<Router>
<div default>
this is a demo route that always matches
</div>
</Router>
</div>
)
License
MIT