Heim > Web-Frontend > CSS-Tutorial > So gestalten Sie aktive Nav-Links in Serverkomponenten in Next.js

So gestalten Sie aktive Nav-Links in Serverkomponenten in Next.js

Patricia Arquette
Freigeben: 2024-11-26 20:04:14
Original
545 Leute haben es durchsucht

Hallo zusammen! Next.js ist derzeit sehr angesagt, insbesondere mit der neuen Version 15, die viele coole Funktionen hinzugefügt hat. Aber darum geht es heute nicht. Die bekanntesten Funktionen von Next.js sind der dateibasierte Router und das integrierte SSR (Server-Side Rendering).

SSR ist ein komplexes Thema, insbesondere wenn es um die Synchronisierung der Server- und Client-Zustände Ihrer App geht. Hier entscheiden sich viele Menschen stattdessen für Client-Side Rendering (CSR). Natürlich gibt es Szenarien, in denen Serverkomponenten nicht realisierbar sind, aber der entscheidende Punkt ist, dass Next.js im Wesentlichen auf SSR basiert, um Leistung und SEO zu verbessern, was es zu einer leistungsstarken Wahl für Anwendungen macht, die vom Rendering auf dem Server profitieren.


Soooo, wie erstellen wir eine Navigationsleiste mit Links, die hervorgehoben werden, wenn wir uns auf einer bestimmten Seite befinden? Der grundlegende Ansatz besteht darin, eine Reihe von Links zu durchlaufen und den Link hervorzuheben, dessen Pfadname mit dem aktuellen Pfad im Browser übereinstimmt. Um den Pfadnamen in Next.js zu erhalten, können Sie den Hook „Pathname“ (useRouter für Seitenrouter) verwenden. Mit diesem Ansatz erhalten wir am Ende etwas wie:

"use client";
import { cn } from "@/lib/utils";
import { usePathname } from "next/navigation";
import Link, { type LinkProps } from "next/link";

type ClientNavProps = {
  links: LinkProps[];
};

function ClientNav({ links }: ClientNavProps) {
  const pathname = usePathname();

  const isActive = (href: LinkProps["href"]) => {
    const hrefStr = href.toString();
    if (hrefStr === pathname) return true;
    if (hrefStr.length > 1 && pathname.startsWith(hrefStr)) return true;
    return false;
  };

  return (
    <nav className="space-x-2">
      {links.map((e) => (
        <Link
          {...e}
          key={e.href.toString()}
          className={cn(
            "px-2 py-1 border rounded-lg",
            isActive(e.href) && "bg-black text-white"
          )}
        />
      ))}
    </nav>
  );
}

export default ClientNav;
Nach dem Login kopieren

So wird es im Browser aussehen:

How to style active Nav links in server components in Next.js


Das Problem bei diesem Ansatz besteht jedoch darin, dass die Komponente clientbasiert ist, was für SEO nicht ideal ist. Da wir in Serverkomponenten keine Client-Hooks aufrufen können, müssen wir uns mit der Frage befassen, wie wir den Pfadnamen auf der Serverseite erhalten, um den aktuellen Link als hervorgehoben darzustellen.

Und diese Frage ist nicht schwer zu beantworten, hier kommt Middleware zum Einsatz. Mithilfe von Middleware können wir den Pfadnamen zu den Antwortheadern hinzufügen und ihn so konfigurieren, dass er für alle Seitenrouten ausgelöst wird:

import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

export const config = {
  matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
};

export default function middleware(request: NextRequest) {
  const requestHeaders = new Headers(request.headers);
  requestHeaders.set("x-next-pathname", request.nextUrl.pathname);

  return NextResponse.next({ request: { headers: requestHeaders } });
}
Nach dem Login kopieren

Da wir nun x-next-pathname mit dem aktuellen Pfadnamen haben, können wir mit der Header-Funktion darauf zugreifen (beachten Sie, dass Next 15 und höher jetzt über asynchrone Header, Cookies, Parameter und Suchparameter verfügen).

import { cn } from "@/lib/utils";
import { headers } from "next/headers";
import Link, { type LinkProps } from "next/link";

type ClientNavProps = {
  links: LinkProps[];
};

async function ServerNav({ links }: ClientNavProps) {
  const headersList = await headers();
  const pathname = headersList.get("x-next-pathname") || "/";

  const isActive = (href: LinkProps["href"]) => {
    const hrefStr = href.toString();
    if (hrefStr === pathname) return true;
    if (hrefStr.length > 1 && pathname.startsWith(hrefStr)) return true;
    return false;
  };

  return (
    <nav className="space-x-2">
      {links.map((e) => (
        <Link
          {...e}
          key={e.href.toString()}
          className={cn(
            "px-2 py-1 border rounded-lg",
            isActive(e.href) && "bg-black text-white"
          )}
        />
      ))}
    </nav>
  );
}

export default ServerNav;
Nach dem Login kopieren

Seien Sie vorsichtig bei der Platzierung der Server-Navigationsleiste in Ihrer App. Dieses spezielle Beispiel funktioniert nur, wenn es in page.tsx-Dateien verwendet wird, da es bei URL-Änderungen neu gerendert werden muss.


Dies ist wahrscheinlich die einfachste Möglichkeit, eine serverseitige Navigationsleistenkomponente zu erstellen, die den aktuell aktiven Link hervorhebt. Das war’s – danke fürs Lesen und bis zum nächsten Mal!

Das obige ist der detaillierte Inhalt vonSo gestalten Sie aktive Nav-Links in Serverkomponenten in Next.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage