در نسخههای جدید Next.js، شما میتوانید مستقیماً از متدهای بومی مرورگر یعنی window.history.pushState و window.history.replaceState برای بهروزرسانی آدرس بار (URL) بدون رفرش شدن صفحه استفاده کنید.
نکته جذاب اینجاست که این متدهای بومی کاملاً با روتر داخلی Next.js یکپارچه (Integrate) شدهاند. این یعنی به محض استفاده از آنها، هوکهای روتر مثل usePathname و useSearchParams متوجه تغییرات آدرس شده و خود را بهروزرسانی میکنند.
کاربرد و نحوه استفاده از window.history.pushState برای افزودن تاریخچه جدید
کاربرد و نحوه استفاده از window.history.replaceState برای جایگزینی تاریخچه فعلی
نحوه همگامسازی مروگر با هوکهای ناوبری Next.js
window.history.pushStateزمانی از pushState استفاده میکنیم که میخواهیم یک آیتم یا آدرس جدید به پشته تاریخچه (History Stack) مرورگر اضافه شود. در این حالت، اگر کاربر روی دکمه Back (بازگشت) مرورگر کلیک کند، به حالت قبلی URL برمیگردد.
فرض کنید میخواهید دکمههایی برای مرتبسازی محصولات (صعودی/نزولی) بسازید و این وضعیت را در URL ذخیره کنید تا کاربر با زدن دکمه Back مرورگر، به حالت مرتبسازی قبلی بازگردد:
'use client'
import { useSearchParams } from 'next/navigation'
export default function SortProducts() {
const searchParams = useSearchParams()
function updateSorting(sortOrder: string) {
// ۱. کپی کردن پارامترهای فعلی URL
const params = new URLSearchParams(searchParams.toString())
// ۲. ست کردن پارامتر جدید یا تغییر پارامتر قبلی
params.set('sort', sortOrder)
// ۳. تزریق به تاریخچه مرورگر (آدرس جدید به هیستوری push میشود)
window.history.pushState(null, '', `?${params.toString()}`)
}
return (
<div className="flex gap-2">
<button onClick={() => updateSorting('asc')}>مرتبسازی صعودی</button>
<button onClick={() => updateSorting('desc')}>مرتبسازی نزولی</button>
</div>
)
}
window.history.replaceStateزمانی از replaceState استفاده میکنیم که میخواهیم آدرس فعلی در پشته تاریخچه مرورگر را با آدرس جدید اوررایت (Jayeghazin) کنیم. در این حالت، رکورد جدیدی ثبت نمیشود و اگر کاربر دکمه Back مرورگر را بزند، به حالت قبل از این کلیک برنمیگردد (بلکه به کل از این صفحه خارج شده و به صفحه کاملاً قبلی هدایت میشود).
تغییر زبان کل اپلیکیشن نمونه بارز استفاده از replaceState است؛ چون منطقی نیست که کاربر با زدن دکمه Back مرورگر، فقط زبان صفحهاش تغییر کند، بلکه تمایل دارد به صفحه قبلی وبسایت بازگردد:
'use client'
import { usePathname } from 'next/navigation'
export function LocaleSwitcher() {
const pathname = usePathname()
function switchLocale(locale: string) {
// تولید آدرس جدید بر اساس زبان انتخابی (مثلاً en/about/ یا fr/about/)
const newPath = `/${locale}${pathname}`
// جایگزین کردن آدرس فعلی مرورگر بدون اضافه کردن ردیف جدید به هیستوری
window.history.replaceState(null, '', newPath)
}
return (
<div className="flex gap-2">
<button onClick={() => switchLocale('en')}>English</button>
<button onClick={() => switchLocale('fr')}>French</button>
</div>
)
}
| متد (Method) | اثر روی پشته تاریخچه مرورگر | رفتار دکمه Back مرورگر | کاربرد رایج |
pushState | یک آدرس جدید روی آدرس قبلی اضافه میکند. | کاربر را به حالت یا فیلتر قبلی برمیگرداند. | فیلترها، پجینیشن (صفحهبندی)، مرتبسازی محصولات |
replaceState | آدرس فعلی را پاک کرده و آدرس جدید را جایگزین میکند. | کاربر به حالت قبل برنمیگردد (مستقیم به صفحه قبلی میرود). | تغییر زبان، بهروزرسانیهای پسزمینه، فرمهای چندمرحلهای پس از ثبت |
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://nextjs.org/docs/app