useRouter
يسمح لك خطاف useRouter بتغيير المسارات برمجيًا داخل مكونات العميل (Client Components).
توصية: استخدم مكون
<Link>للتنقل إلا إذا كان لديك متطلب محدد لاستخدامuseRouter.
'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button type="button" onClick={() => router.push('/dashboard')}>
Dashboard
</button>
)
}'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button type="button" onClick={() => router.push('/dashboard')}>
Dashboard
</button>
)
}useRouter()
router.push(href: string, { scroll: boolean }): تنفيذ تنقل من جانب العميل إلى المسار المحدد. يضيف إدخالًا جديدًا إلى سجل المتصفح (browser’s history).router.replace(href: string, { scroll: boolean }): تنفيذ تنقل من جانب العميل إلى المسار المحدد دون إضافة إدخال جديد إلى سجل المتصفح (browser’s history stack).router.refresh(): تحديث المسار الحالي. يقوم بعمل طلب جديد إلى الخادم، وإعادة جلب طلبات البيانات، وإعادة عرض مكونات الخادم. سيقوم العميل بدمج حمولة مكون الخادم المحدثة دون فقدان حالة React من جانب العميل (مثلuseState) أو حالة المتصفح (مثل موضع التمرير).router.prefetch(href: string): جلب مسبق (Prefetch) للمسار المحدد لتحقيق انتقالات أسرع من جانب العميل.router.back(): التنقل للخلف إلى المسار السابق في سجل المتصفح.router.forward(): التنقل للأمام إلى الصفحة التالية في سجل المتصفح.
معلومة مفيدة:
- يجب ألا ترسل عناوين URL غير موثوقة أو غير معالجة إلى
router.pushأوrouter.replace، لأن هذا قد يعرض موقعك لثغرات البرمجة النصية عبر المواقع (XSS). على سبيل المثال، سيتم تنفيذ عناوين URL مثلjavascript:المرسلة إلىrouter.pushأوrouter.replaceفي سياق صفحتك.- يقوم مكون
<Link>تلقائيًا بجلب المسارات مسبقًا عندما تصبح مرئية في نطاق العرض.- قد يعيد
refresh()نفس النتيجة إذا كانت طلبات الجلب مخزنة مؤقتًا. كما قد تغير واجهات برمجة التطبيقات الديناميكية الأخرى مثلcookiesوheadersالاستجابة.
الانتقال من next/router
- يجب استيراد خطاف
useRouterمنnext/navigationوليس منnext/routerعند استخدام موجه التطبيق (App Router) - تمت إزالة سلسلة
pathnameواستبدالها بـusePathname() - تمت إزالة كائن
queryواستبداله بـuseSearchParams() - تم استبدال
router.events. انظر أدناه.
أمثلة
أحداث الموجه (Router events)
يمكنك الاستماع لتغييرات الصفحة عن طريق تكوين خطافات مكونات العميل الأخرى مثل usePathname و useSearchParams.
'use client'
import { useEffect } from 'react'
import { usePathname, useSearchParams } from 'next/navigation'
export function NavigationEvents() {
const pathname = usePathname()
const searchParams = useSearchParams()
useEffect(() => {
const url = `${pathname}?${searchParams}`
console.log(url)
// يمكنك الآن استخدام عنوان URL الحالي
// ...
}, [pathname, searchParams])
return '...'
}والتي يمكن استيرادها في تخطيط (layout).
import { Suspense } from 'react'
import { NavigationEvents } from './components/navigation-events'
export default function Layout({ children }) {
return (
<html lang="en">
<body>
{children}
<Suspense fallback={null}>
<NavigationEvents />
</Suspense>
</body>
</html>
)
}معلومة مفيدة: تم تغليف
<NavigationEvents>في حدودSuspenseلأنuseSearchParams()يتسبب في العرض من جانب العميل حتى حدودSuspenseالأقرب أثناء العرض الثابت (static rendering). معرفة المزيد.
تعطيل التمرير إلى الأعلى
بشكل افتراضي، سيقوم Next.js بالتمرير إلى أعلى الصفحة عند التنقل إلى مسار جديد. يمكنك تعطيل هذا السلوك عن طريق تمرير scroll: false إلى router.push() أو router.replace().
'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button
type="button"
onClick={() => router.push('/dashboard', { scroll: false })}
>
Dashboard
</button>
)
}'use client'
import { useRouter } from 'next/navigation'
export default function Page() {
const router = useRouter()
return (
<button
type="button"
onClick={() => router.push('/dashboard', { scroll: false })}
>
Dashboard
</button>
)
}سجل الإصدارات
| الإصدار | التغييرات |
|---|---|
v13.0.0 | تم تقديم useRouter من next/navigation. |