
本文旨在解决 Next.js 13 中 loading.tsx 组件无法在页面刷新时显示的问题。通过分析 Next.js 的路由机制和 Loading UI 的工作原理,阐述了 Loading 组件的正确使用场景,并提供了一种在页面初次加载时模拟 Loading 效果的方案,帮助开发者提升用户体验。
在 Next.js 13 的 App Router 中,loading.tsx 文件用于创建 Loading UI。这个 Loading UI 的主要作用是在页面导航时,为用户提供即时的反馈,表明页面正在加载。它会在新页面组件完全渲染之前显示,从而提升用户体验。
关键在于,loading.tsx 是为页面导航设计的,而不是为页面首次加载设计的。当你直接访问或刷新一个页面时,Next.js 会直接渲染服务器返回的完整页面,而不会触发 Loading UI。
根据提供的代码,loading.tsx 文件和 page.tsx 文件都放置在正确的目录下。但是,Loading 组件未显示的原因在于:页面是直接加载或刷新的,而非通过 Next.js 的路由进行导航。
Next.js 官方文档明确指出,Loading UI 的设计目的是为了在页面导航时提供即时反馈。因此,直接访问或刷新页面时,不会触发 Loading UI。
虽然 loading.tsx 不能直接用于页面首次加载,但我们可以通过其他方式模拟 Loading 效果。一种常见的做法是使用状态管理和条件渲染。
示例代码:
import { useState, useEffect } from 'react';
import { IResult } from '@/interface';
import Results from '@/components/Results';
const API_KEY = process.env.API_KEY;
export default function Home({ searchParams }: { searchParams: any }) {
const [isLoading, setIsLoading] = useState(true); // 初始状态为加载中
const [results, setResults] = useState<IResult[]>([]);
const genre = searchParams.genre || 'fetchTrending';
useEffect(() => {
const fetchData = async () => {
try {
const res = await fetch(
`https://api.themoviedb.org/3/${
genre === 'fetchTopRated' ? 'movie/top_rated' : 'trending/all/week'
}?api_key=${API_KEY}&language=en-US&page=1`,
{ next: { revalidate: 100000 } }
);
if (!res.ok) {
throw new Error('Failed to fetch data');
}
const data = await res.json();
setResults(data.results as IResult[]);
} finally {
setIsLoading(false); // 加载完成后设置为 false
}
};
fetchData();
}, [genre]);
if (isLoading) {
return <div>Loading...</div>; // 显示 Loading 组件
}
return (
<>
<main className="flex min-h-screen flex-col items-center justify-between p-4">
<Results results={results}></Results>
</main>
</>
);
}代码解释:
注意事项:
Next.js 13 的 loading.tsx 组件主要用于页面导航时的 Loading UI。对于页面首次加载或刷新,需要通过状态管理和条件渲染来模拟 Loading 效果。通过合理使用 Loading UI,可以显著提升用户体验,让用户知道应用正在响应,并减少等待的焦虑感。
以上就是Next.js 13 Loading 组件无法显示问题排查与解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号