Хлебные крошки и NextJS

#reactjs #next.js #breadcrumbs

#reactjs #next.js #панировочные сухари

Вопрос:

Я хотел бы создать хлебную крошку для моего приложения NextJS, и я хотел бы знать, есть ли хороший или практичный способ сделать это?

Я хотел бы изучить дизайн Ant, но пример компонента с React Router не хочет работать для меня.

Мне нужна ваша помощь, пожалуйста…

Комментарии:

1. Даже я ищу этот ответ, если вы нашли ответ на приведенный выше запрос, пожалуйста, опубликуйте ответ. Я приму это.

Ответ №1:

Если вы используете Next.js система маршрутизации Я предлагаю вам взглянуть на nextjs-breadcrumbs, она проста и эффективна.

Или, если вы предпочитаете писать свой собственный компонент, используйте их код в качестве ссылки.

 import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/router';
import Link from 'next/link';

const convertBreadcrumb = string => {
  return string
    .replace(/-/g, ' ')
    .replace(/oe/g, 'ö')
    .replace(/ae/g, 'ä')
    .replace(/ue/g, 'ü')
    .toUpperCase();
};

const Breadcrumbs = () => {
  const router = useRouter();
  const [breadcrumbs, setBreadcrumbs] = useState(null);

  useEffect(() => {
    if (router) {
      const linkPath = router.asPath.split('/');
      linkPath.shift();

      const pathArray = linkPath.map((path, i) => {
        return { breadcrumb: path, href: '/'   linkPath.slice(0, i   1).join('/') };
      });

      setBreadcrumbs(pathArray);
    }
  }, [router]);

  if (!breadcrumbs) {
    return null;
  }

  return (
    <nav aria-label="breadcrumbs">
      <ol className="breadcrumb">
        <li>
          <a href="/">HOME</a>
        </li>
        {breadcrumbs.map((breadcrumb, i) => {
          return (
            <li key={breadcrumb.href}>
              <Link href={breadcrumb.href}>
                <a>
                  {convertBreadcrumb(breadcrumb.breadcrumb)}
                </a>
              </Link>
            </li>
          );
        })}
      </ol>
    </nav>
  );
};

export default Breadcrumbs;
  

Ответ №2:

Это мой подход к хлебным крошкам в nextjs, он использует router.asPath для получения ссылки на крошку и router.route для получения метки, если она существует в Route2LabelMap .

страницы/example.jsx

 export default function Page() {
  return <>
    <BreadCrumbs />
    <h1>My Page</h1>
  </>
}
  

компоненты/BreadCrumbs.jsx

 import Link from "next/link";
import { useRouter } from "next/router";
import React from "react";

/*
interface BreadCrumb {
  route: string;
  label: string;
  link: string;
}
*/

const Route2LabelMap = {
  "/": "Home",
  "/profile/[username]/barrels": "Your Barrels",
  "/barrels": "Barrel List",
  "/barrels/[barrel_id]": "Barrel",
  "/barrels/[barrel_id]/settings": "Settings",
};

export function BreadCrumbs() {
  const router = useRouter();

  const [crumbs, setCrumbs] = React.useState([]);

  React.useEffect(() => {
    const segmentsPath = router.asPath.split("/");
    const segmentsRoute = router.route.split("/");
    const crumbLinks = CombineAccumulatively(segmentsPath);
    const crumbLabels = CombineAccumulatively(segmentsRoute);

    const crumbs = crumbLinks.map((link, index) => {
      const route = crumbLabels[index];
      const crumb = {
        link: link,
        route: route,
        label: Route2LabelMap[route] || route,
      };
      return crumb;
    });
    setCrumbs(crumbs);

    console.log({
      router,
      segmentsPath,
      segmentsRoute,
      crumbLinks,
      crumbLabels,
      crumbs,
    });
  }, [router.route]);

  return (
    <div className="w-full flex gap-1">
      {crumbs.map((c, i) => {
        return (
          <div className="flex items-center gap-1" key={i}>
            {(i > 0) ? <div>{'>'}</div> : null}
            <div className={(i == (crumbs.length - 1) ? 'bg-blue-300 ' : 'bg-gray-300 ')   " px-2 py-1 rounded-xl"}>
              <Link href={c.link}>
                <a>{c.label}</a>
              </Link>
            </div>
          </div>
        );
      })}
    </div>
  );
}

function CombineAccumulatively(segments) {
  /* 
  when segments = ['1','2','3']
  returns ['1','1/2','1/2/3']
  */
  const links = segments.reduce((acc, cur, curIndex) => {
    const last = curIndex > 1 ? acc[curIndex - 1] : "";
    const newPath = last   "/"   cur;
    acc.push(newPath);
    return acc;
  }, []);
  return links;
}
  

Отрисованные панировочные сухари

В этом случае отображается либо маршрут, либо метка, если она существует в Route2LabelMap переменной, как это делает «Your Barrels».

введите описание изображения здесь

Ответ №3:

     const router = useRouter()
    const linkPath = router.asPath.split('/');
    linkPath.shift();

    const pathArray = linkPath.map((path, i) => {
        return { breadcrumb: path, href: '/'   linkPath.slice(0, i   1).join('/') };
    });
    console.log(pathArray)
  

Комментарии:

1. Хорошее решение. Как добавить сюда маршрут домашней страницы?

2. Вам нужно добавить его «вручную», потому что на вашей домашней странице есть URL-адрес «/». Итак, когда вы создаете компонент для показа pathArray , вы просто добавляете в начале <Link> с домашней страницы

Ответ №4:

Установка

 yarn add nextjs-antd-breadcrumbs
  

Использование

Компонент должен использоваться в Next.js и не будет работать в обычном React. Он всегда будет отображать динамическую навигацию по хлебным крошкам, основанную на текущем пути к следующему маршрутизатору.

 import React from 'react';
import Breadcrumbs from 'nextjs-antd-breadcrumbs';

const Example = () => {
  return <Breadcrumbs rootLabel="Home" omitRootLabel={false}/>;
};
  

Ответ №5:

Я думал об использовании nextjs breadcrumbs, но мне не удалось согласовать его стиль с antd (Ant Desing). И хотел использовать компонент breadcrumb по умолчанию, который предоставлял antd, таким образом, возвращая какой-то собственный простой компонент, который использует next js router и некоторый фрагмент js.

 const router = useRouter();
let routes= router.route.split('/');
let str='';
let hlinks=[];
routes.forEach((i,index,arr)=>{
    if(i.charAt(0)=='[')
    {
        i=i.slice(1);
        i=i.slice(0, i.length - 1);
        console.log(i)
        arr[index]=router.query[i];
    }
    str=str arr[index] '/';
    hlinks.push(str);
});
console.log(hlinks);
console.log(routes);
  

Ответ №6:

Вы можете использовать хлебные крошки со следующим JS, как показано ниже:

 import { Breadcrumb } from "antd";
import styles from "../styles/Home.module.scss";
import { useRouter } from "next/router";
import React from "react";
import Link from "next/link";
import { HomeOutlined } from "@ant-design/icons";

const BreadcrumbComp = () => {
  const router = useRouter();
  const value = router.asPath.toLowerCase().split("/");
  console.log(value);

  const path = value.map(
    (value) => value.charAt(0).toUpperCase()   value.substring(1).toLowerCase()
  );

  return (
    <div>
      <Breadcrumb className={styles.breadcrumb}>
        <Breadcrumb.Item>
          <Link href="/home">
            <HomeOutlined />
          </Link>
        </Breadcrumb.Item>
        <Breadcrumb.Item>{path[1]   " / "   path[2]}</Breadcrumb.Item>
      </Breadcrumb>
    </div>
  );
};

export default BreadcrumbComp;  

Комментарии:

1. Здесь путь [0] = » » , путь [1] = «Array_value_one», путь [2] = «Значение массива два». Хотя моя структура папок была такой же, как pages / main / routePages.jsx

Ответ №7:

Вы можете реализовать хлебные крошки в Next JS с дизайном Antd, как показано ниже:

 import { Breadcrumb } from "antd";
import styles from "../styles/Home.module.scss";
import { useRouter } from "next/router";
import React from "react";
import Link from "next/link";
import { HomeOutlined } from "@ant-design/icons";

const BreadcrumbComp = () => {
  const router = useRouter();
  const value = router.asPath.toLowerCase().split("/");
  console.log(value);

  const path = value.map(
    (value) => value.charAt(0).toUpperCase()   value.substring(1).toLowerCase()
  );

  return (
    <div>
      <Breadcrumb className={styles.breadcrumb}>
        <Breadcrumb.Item>
          <Link href="/home">
            <HomeOutlined />
          </Link>
        </Breadcrumb.Item>
        <Breadcrumb.Item>{path}</Breadcrumb.Item>
      </Breadcrumb>
    </div>
  );
};

export default BreadcrumbComp;