You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Next.js中如何使用自定义加载器替代默认加载器

在Next.js中替换默认加载器为自定义加载器的方法

根据使用的Next.js路由体系(App Router/Pages Router),可以通过不同方式实现自定义加载器替代默认效果,以下是常见场景的具体实现:

1. App Router 页面级自定义加载

在App Router中,Next.js提供了loading.js约定式文件来定义页面的加载组件,无需手动判断状态,框架会自动在数据加载时渲染该组件:

// app/[page]/loading.js
export default function CustomLoading() {
  return (
    <div style={{ 
      display: 'flex', 
      justifyContent: 'center', 
      alignItems: 'center', 
      height: '100vh' 
    }}>
      <div className="custom-spinner">加载中...</div>
      {/* 这里可以替换为你的自定义动画组件 */}
    </div>
  )
}

2. 组件内条件加载(对应你的示例场景)

如果是在组件内部根据业务状态控制加载显示,直接通过状态判断渲染自定义加载组件即可,完善后的示例如下:

'use client' // App Router下的客户端组件需要添加此标识

import { useState, useEffect } from 'react'
import CustomLoading from './CustomLoading'
import TargetContent from './TargetContent'

export default function DataDrivenComponent() {
  const [isRefreshing, setIsRefreshing] = useState(true)

  useEffect(() => {
    // 模拟数据请求或异步操作
    const fetchData = async () => {
      await new Promise(resolve => setTimeout(resolve, 2000))
      setIsRefreshing(false)
    }
    fetchData()
  }, [])

  // 加载状态下渲染自定义组件,否则渲染业务内容
  if (isRefreshing) {
    return <CustomLoading />
  }

  return <TargetContent />
}

3. 路由切换时的全局自定义加载(App Router)

要在路由跳转过程中显示自定义加载组件,可在根layout.js中监听路由事件:

'use client'

import { useRouter } from 'next/navigation'
import { useState, useEffect } from 'react'
import CustomLoading from './CustomLoading'

export default function RootLayout({ children }) {
  const router = useRouter()
  const [isRouting, setIsRouting] = useState(false)

  useEffect(() => {
    const handleRouteStart = () => setIsRouting(true)
    const handleRouteEnd = () => setIsRouting(false)

    router.events.on('routeChangeStart', handleRouteStart)
    router.events.on('routeChangeComplete', handleRouteEnd)
    router.events.on('routeChangeError', handleRouteEnd)

    // 组件卸载时移除监听
    return () => {
      router.events.off('routeChangeStart', handleRouteStart)
      router.events.off('routeChangeComplete', handleRouteEnd)
      router.events.off('routeChangeError', handleRouteEnd)
    }
  }, [router])

  return (
    <html lang="zh-CN">
      <body>
        {isRouting && <CustomLoading />}
        {children}
      </body>
    </html>
  )
}

4. Pages Router 全局自定义加载

如果使用Pages Router,可在_app.js中监听路由状态实现全局加载:

// pages/_app.js
import { useEffect, useState } from 'react'
import { useRouter } from 'next/router'
import CustomLoading from '../components/CustomLoading'

function MyApp({ Component, pageProps }) {
  const router = useRouter()
  const [isLoading, setIsLoading] = useState(false)

  useEffect(() => {
    const startLoading = () => setIsLoading(true)
    const endLoading = () => setIsLoading(false)

    router.events.on('routeChangeStart', startLoading)
    router.events.on('routeChangeComplete', endLoading)
    router.events.on('routeChangeError', endLoading)

    return () => {
      router.events.off('routeChangeStart', startLoading)
      router.events.off('routeChangeComplete', endLoading)
      router.events.off('routeChangeError', endLoading)
    }
  }, [router])

  return (
    <>
      {isLoading && <CustomLoading />}
      <Component {...pageProps} />
    </>
  )
}

export default MyApp

内容的提问来源于stack exchange,提问作者Danny Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:37:18