use-route-matching
TypeScript icon, indicating that this package has built-in type declarations

0.0.1 • Public • Published

use-route-matching

Features

Retrieves an object with the same structure as the application routes, with the match information about the current location.

Usage

Important It is necessary to use it in Router's child components.

For example, if you have the following routes object:

const routes = {
  list: "/products",
  product: {
    root: "/product/:id",
    info: "/product/:id/info",
    gallery: "/product/:id/gallery",
    details: "/product/:id/details",
  },
  contact: "/contact",
};

You can use the hook in your product info component (ie: /product/1955/info):

const routeMatching = useRouteMatching(routes);

You have the following result:

routeMatching = {
  list: null,
  product: {
    root: { path: "/product/:id", url: "/product/1955", isExact: false, params: { id: "1955" } },
    info: { path: "/product/:id/info", url: "/product/1955/info", isExact: true, params: { id: "1955" } },
    gallery: null,
    details: null,
  },
  contact: null,
};

Installing

Using npm:

$ npm install use-route-matching

Using yarn:

$ yarn install use-route-matching

Peer dependencies

use-route-matching needs the following peer dependencies:

"react": ">=16.8.6",
"react-dom": ">=16.8.6",
"react-router-dom": ">=5.1.2"

Typescript

use-route-matching includes TypeScript definitions.

Example

import React from "react";
import { useHistory } from "react-router-dom";
import { useRouteMatching } from "use-route-matching";
import { routes } from "./routes";

const routes = {
  list: "/products",
  profile: {
    root: "/user-profile",
    account: "/user-profile/account",
    settings: "/user-profile/settings",
  },
  contact: "/contact",
};

export const AppLayout = ({ children }) => {
  const history = useHistory();
  const routeMatching = useRouteMatching(routes);

  const handleClick = path => () => history.push(path);

  return (
    <>
      <header>
        <ul>
          <li onClick={handleClick(routes.list)} className={routeMatching.list ? "selected" : ""}>
            Products List
          </li>
          <li onClick={handleClick(routes.contact)} className={routeMatching.contact ? "selected" : ""}>
            Contact
          </li>
          <li className={routeMatching.profile.root ? "selected" : ""}>
            Profile
            <ul>
              <li
                onClick={handleClick(routes.profile.account)}
                className={routeMatching.profile.account ? "selected" : ""}
              >
                Account
              </li>
              <li
                onClick={handleClick(routes.profile.settings)}
                className={routeMatching.profile.settings ? "selected" : ""}
              >
                Settings
              </li>
            </ul>
          </li>
        </ul>
      </header>
      <main>{children}</main>
    </>
  );
};

Credits

Link to author github

Package Sidebar

Install

npm i use-route-matching

Weekly Downloads

28

Version

0.0.1

License

ISC

Unpacked Size

150 kB

Total Files

11

Last publish

Collaborators

  • borrego