Next.js 15 رفتار پیمایش: یک راهنمای جامع

Next.JS 15 پیشرفت های چشمگیری را در کنترل رفتار ناوبری و پیمایش ایجاد کرد و به توسعه دهندگان گزینه های ریز و درشت تر برای ایجاد تجربیات کاربر صاف می دهد. این مقاله در اعماق این ویژگی ها غرق می شود و نمونه های عملی را برای مبتدیان و توسعه دهندگان پیشرفته ارائه می دهد.
درک رفتار پیمایش در Next.js
از نظر تاریخی ، چارچوب های وب هنگام حرکت بین مسیرها به پیمایش به بالای صفحه پرداخته اند. در حالی که این رفتار در برنامه های سنتی چند صفحه ای معنا پیدا می کند ، برنامه های وب مدرن اغلب نیاز به کنترل ظریف تری بر موقعیت پیمایش دارند.
next.js 15 این را با جدید می پردازد scroll
خاصیت ، که به توسعه دهندگان کنترل صریح بر ترمیم پیمایش در هنگام ناوبری می دهد.
استفاده اساسی: scroll
غرفه
با مؤلفه پیوند
ساده ترین روش برای کنترل رفتار پیمایش از طریق Link
مؤلفه:
import Link from 'next/link'
// Default behavior: scrolls to top
<Link href="/products">View Products</Link>
// Prevents scrolling to top
<Link href="/products" scroll={false}>View Products</Link>
کی scroll={false}
مشخص شده است ، Next.js موقعیت پیمایش کاربر را پس از پیمایش حفظ می کند و یک تجربه یکپارچه ایجاد می کند.
با ناوبری برنامه ای
برای ناوبری برنامه ای ، scroll
گزینه از طریق روتر در دسترس است:
import { useRouter } from 'next/navigation'
function FilterProducts() {
const router = useRouter()
const applyFilter = (filter) => {
// Maintain scroll position when applying filters
router.push(`/products?category=${filter}`, { scroll: false })
}
return (
<button onClick={() => applyFilter('electronics')}>
Filter by Electronics
button>
)
}
موارد استفاده پیشرفته
اجرای پیمایش بی نهایت
در scroll={false}
گزینه هنگام اجرای الگوهای پیمایش بی نهایت می درخشد:
import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation'
function InfiniteProductList() {
const [page, setPage] = useState(1)
const [products, setProducts] = useState([])
const router = useRouter()
const loadMore = async () => {
const newPage = page + 1
// Update URL to reflect new page without scrolling
router.push(`/products?page=${newPage}`, { scroll: false })
// Fetch more products
const newProducts = await fetchProducts(newPage)
setProducts([...products, ...newProducts])
setPage(newPage)
}
// Intersection Observer to detect when user reaches bottom
useEffect(() => {
// Implementation details...
}, [])
return (
<div>
{products.map(product => (
<ProductCard key={product.id} product={product} />
))}
<div ref={observerRef}>Loading more...div>
div>
)
}
اشکال چند مرحله ای
برای اشکال چند مرحله ای که در آن زمینه حفظ بسیار مهم است:
function CheckoutProcess() {
const router = useRouter()
const [formData, setFormData] = useState({})
const goToNextStep = (step) => {
// Save current form data
localStorage.setItem('checkout-data', JSON.stringify(formData))
// Navigate to next step without scrolling to top
router.push(`/checkout/step-${step}`, { scroll: false })
}
return (
<form onSubmit={() => goToNextStep(2)}>
{/* Form fields */}
<button type="submit">Continue to Shippingbutton>
form>
)
}
به عناصر خاص بروید
در حالی که scroll={false}
از پیمایش خودکار به بالا جلوگیری می کند ، ممکن است بخواهید پس از ناوبری به عناصر خاص بروید. می توانید ویژگی پیمایش را با useEffect
قلاب:
import { useEffect, useRef } from 'react'
import { useSearchParams } from 'next/navigation'
function ProductPage() {
const reviewsRef = useRef(null)
const searchParams = useSearchParams()
useEffect(() => {
// Check if we should scroll to reviews section
if (searchParams.get('section') === 'reviews' && reviewsRef.current) {
reviewsRef.current.scrollIntoView({
behavior: 'smooth',
block: 'start'
})
}
}, [searchParams])
return (
<div>
<ProductDetails />
<div ref={reviewsRef} id="reviews">
<h2>Customer Reviewsh2>
{/* Reviews content */}
div>
div>
)
}
پیامدهای عملکرد
API رفتار پیمایش در Next.js 15 به طور مؤثر اجرا می شود ، اما ملاحظات وجود دارد:
-
استفاده از حافظه: هنگام استفاده
scroll={false}
، next.js باید اطلاعات دولتی را در مورد موقعیت پیمایش حفظ کند ، که مقدار کمی از حافظه را مصرف می کند. -
بار صفحه اولیه:
scroll
PROP فقط بر ناوبری بین مسیرهای موجود در برنامه شما تأثیر می گذارد ، نه بار اولیه صفحه. -
چیدمان های تو در تو: در روتر برنامه ، این رفتار در مورد بخش های تغییر یافته مسیر ، با احترام به ساختار طرح بندی تو در تو اعمال می شود.
بهترین روشها
چه زمانی استفاده کنید scroll={false}
- فیلتر یا مرتب سازی عملیات که در آن زمینه حفظ مهم است
- رابط های Tabbed که در آن محتوا تغییر می کند اما طرح یکسان است
- پیاده سازی های پیمایش بی نهایت
- فرم های چند مرحله ای یا جادوگران
چه موقع باید رفتار پیمایش پیش فرض را حفظ کنیم
- مسیر اصلی تغییر می کند که محتوای جدید باید از بالا مشاهده شود
- هنگام انتقال بین بخشهای مختلف متفاوت برنامه شما
- به دلایل دسترسی ، وقتی کاربران انتظار دارند از بالا شروع کنند
سازگاری مرورگر
NEXT.JS کنترل رفتار پیمایش در تمام مرورگرهای مدرن کار می کند. این پیاده سازی از API History استفاده می کند و در مرورگرهای قدیمی تر به طرز فجیعی باز می گردد.
مرمت پیمایش سفارشی
برای سناریوهای پیچیده تر ، ممکن است بخواهید منطق ترمیم پیمایش سفارشی را پیاده سازی کنید:
'use client'
import { useEffect } from 'react'
import { usePathname, useSearchParams } from 'next/navigation'
export function ScrollRestorationManager() {
const pathname = usePathname()
const searchParams = useSearchParams()
useEffect(() => {
// Save current scroll position for this route
const saveScrollPosition = () => {
const positions = JSON.parse(sessionStorage.getItem('scrollPositions') || '{}')
positions[pathname + searchParams.toString()] = window.scrollY
sessionStorage.setItem('scrollPositions', JSON.stringify(positions))
}
// Restore scroll position if available
const restoreScrollPosition = () => {
const positions = JSON.parse(sessionStorage.getItem('scrollPositions') || '{}')
const savedPosition = positions[pathname + searchParams.toString()]
if (savedPosition !== undefined) {
window.scrollTo(0, savedPosition)
}
}
// Add event listeners
window.addEventListener('beforeunload', saveScrollPosition)
restoreScrollPosition()
return () => {
window.removeEventListener('beforeunload', saveScrollPosition)
}
}, [pathname, searchParams])
return null
}
این مؤلفه می تواند در طرح شما گنجانده شود تا مرمت پیمایش سفارشی را در کل برنامه شما فراهم کند.
ادغام با سایر ویژگی های Next.js
با اجزای سرور
به یاد داشته باشید که scroll
عملکرد PROP به جاوا اسکریپت سمت مشتری نیاز دارد. هنگام استفاده از مؤلفه های سرور ، برای رسیدگی به رفتار پیمایش باید یک بسته بندی مؤلفه مشتری ایجاد کنید:
// ServerComponent.jsx
export default function ProductList({ products }) {
return (
<div>
{products.map(product => (
<ProductItem key={product.id} product={product} />
))}
div>
)
}
// ClientWrapper.jsx
'use client'
import { useRouter } from 'next/navigation'
import ProductList from './ServerComponent'
export default function ProductListWrapper({ products }) {
const router = useRouter()
const handleProductFilter = (category) => {
router.push(`/products?category=${category}`, { scroll: false })
}
return (
<>
<div className="filters">
<button onClick={() => handleProductFilter('electronics')}>Electronicsbutton>
<button onClick={() => handleProductFilter('clothing')}>Clothingbutton>
div>
<ProductList products={products} />
>
)
}
با حالت تعلیق و بارگیری
رفتار پیمایش به خوبی با مرزهای تعلیق کار می کند و موقعیت پیمایش را حتی در صورت بارگیری محتوا حفظ می کند:
import { Suspense } from 'react'
import LoadingSpinner from '@/components/LoadingSpinner'
import ProductList from '@/components/ProductList'
export default function ProductsPage() {
return (
<div>
<h1>Productsh1>
<Suspense fallback={<LoadingSpinner />}>
<ProductList />
Suspense>
div>
)
}
پایان
Next.JS 15 گزینه های کنترل رفتار پیمایش راهی قدرتمند برای ایجاد تجربیات ناوبری بصری تر ارائه می دهد. با استفاده از scroll
در هر دو Link
ناوبری مؤلفه و برنامه ای ، توسعه دهندگان می توانند تعامل صاف و حفظ زمینه ای را انجام دهند که موقعیت کاربر را دقیقاً در صورت لزوم حفظ می کنند.
این که آیا شما در حال ایجاد یک سایت تجارت الکترونیکی با بارگیری محصول نامحدود ، فرم چند مرحله ای هستید یا فقط می خواهید احساس برنامه خود را بهبود بخشید ، این ابزارها بدون نیاز به پیاده سازی های پیچیده سفارشی ، سطح کنترل مناسب را ارائه می دهند.
از آنجا که برنامه های وب همچنان به سمت تجربیات بیشتر برنامه مانند تکامل می یابند ، ویژگی هایی مانند کنترل پیمایش برای حفظ زمینه کاربر و ایجاد انتقال یکپارچه بین حالتهای مختلف برنامه شما به طور فزاینده ای اهمیت می یابد.