useSelectedLayoutSegment

useSelectedLayoutSegment هو خطاف لمكون العميل (Client Component) يسمح لك بقراءة مقطع المسار النشط بمستوى واحد أسفل التخطيط (Layout) الذي يتم استدعاؤه منه.

يكون مفيدًا لواجهة المستخدم الخاصة بالتنقل، مثل علامات التبويب داخل التخطيط الرئيسي التي تغير النمط بناءً على مقطع الابن النشط.

'use client'

import { useSelectedLayoutSegment } from 'next/navigation'

export default function ExampleClientComponent() {
  const segment = useSelectedLayoutSegment()

  return <p>Active segment: {segment}</p>
}
'use client'

import { useSelectedLayoutSegment } from 'next/navigation'

export default function ExampleClientComponent() {
  const segment = useSelectedLayoutSegment()

  return <p>Active segment: {segment}</p>
}

معلومة مفيدة:

  • بما أن useSelectedLayoutSegment هو خطاف لمكون العميل (Client Component)، وأن التخطيطات (Layouts) هي مكونات خادم (Server Components) افتراضيًا، فإن useSelectedLayoutSegment عادةً ما يتم استدعاؤه عبر مكون عميل يتم استيراده إلى التخطيط.
  • useSelectedLayoutSegment يُرجع فقط المقطع بمستوى واحد أسفل. لاسترجاع جميع المقاطع النشطة، راجع useSelectedLayoutSegments

المعاملات

const segment = useSelectedLayoutSegment(parallelRoutesKey?: string)

يقبل useSelectedLayoutSegment اختياريًا parallelRoutesKey، مما يسمح لك بقراءة مقطع المسار النشط ضمن تلك الفتحة.

القيم المُرجعة

يُرجع useSelectedLayoutSegment سلسلة نصية للمقطع النشط أو null إذا لم يوجد.

على سبيل المثال، بالنظر إلى التخطيطات وعناوين URL أدناه، سيكون المقطع المُرجع:

التخطيطعنوان URL المزورالمقطع المُرجع
app/layout.js/null
app/layout.js/dashboard'dashboard'
app/dashboard/layout.js/dashboardnull
app/dashboard/layout.js/dashboard/settings'settings'
app/dashboard/layout.js/dashboard/analytics'analytics'
app/dashboard/layout.js/dashboard/analytics/monthly'analytics'

أمثلة

إنشاء مكون رابط نشط

يمكنك استخدام useSelectedLayoutSegment لإنشاء مكون رابط نشط يغير النمط بناءً على المقطع النشط. على سبيل المثال، قائمة مشاركات مميزة في الشريط الجانبي لمدونة:

'use client'

import Link from 'next/link'
import { useSelectedLayoutSegment } from 'next/navigation'

// هذا المكون *العميل* سيتم استيراده إلى تخطيط المدونة
export default function BlogNavLink({
  slug,
  children,
}: {
  slug: string
  children: React.ReactNode
}) {
  // الانتقال إلى `/blog/hello-world` سيرجع 'hello-world'
  // لمقطع التخطيط المحدد
  const segment = useSelectedLayoutSegment()
  const isActive = slug === segment

  return (
    <Link
      href={`/blog/${slug}`}
      // تغيير النمط بناءً على ما إذا كان الرابط نشطًا
      style={{ fontWeight: isActive ? 'bold' : 'normal' }}
    >
      {children}
    </Link>
  )
}
'use client'

import Link from 'next/link'
import { useSelectedLayoutSegment } from 'next/navigation'

// هذا المكون *العميل* سيتم استيراده إلى تخطيط المدونة
export default function BlogNavLink({ slug, children }) {
  // الانتقال إلى `/blog/hello-world` سيرجع 'hello-world'
  // لمقطع التخطيط المحدد
  const segment = useSelectedLayoutSegment()
  const isActive = slug === segment

  return (
    <Link
      href={`/blog/${slug}`}
      // تغيير النمط بناءً على ما إذا كان الرابط نشطًا
      style={{ fontWeight: isActive ? 'bold' : 'normal' }}
    >
      {children}
    </Link>
  )
}
// استيراد مكون العميل إلى تخطيط رئيسي (مكون خادم)
import { BlogNavLink } from './blog-nav-link'
import getFeaturedPosts from './get-featured-posts'

export default async function Layout({
  children,
}: {
  children: React.ReactNode
}) {
  const featuredPosts = await getFeaturedPosts()
  return (
    <div>
      {featuredPosts.map((post) => (
        <div key={post.id}>
          <BlogNavLink slug={post.slug}>{post.title}</BlogNavLink>
        </div>
      ))}
      <div>{children}</div>
    </div>
  )
}
// استيراد مكون العميل إلى تخطيط رئيسي (مكون خادم)
import { BlogNavLink } from './blog-nav-link'
import getFeaturedPosts from './get-featured-posts'

export default async function Layout({ children }) {
  const featuredPosts = await getFeaturedPosts()
  return (
    <div>
      {featuredPosts.map((post) => (
        <div key={post.id}>
          <BlogNavLink slug={post.slug}>{post.title}</BlogNavLink>
        </div>
      ))}
      <div>{children}</div>
    </div>
  )
}

سجل الإصدارات

الإصدارالتغييرات
v13.0.0تم تقديم useSelectedLayoutSegment.