文章
next js Routing 学习笔记 02
特殊页面:loading.tsx
这个文件帮助我们创建加载状态,让用户在等待页面内容加载时看到
在加载页面内容过程中,布局中其他组件仍然可以使用,比如导航菜单或者侧边栏功能,即使主内容尚未准备好。
error.tsx 异常展示页面
"use client";
import { useRouter } from "next/navigation";
import { startTransition } from "react";
export default function ErrorBoundary({
error,
reset,
}: {
error: Error;
reset: () => void;
}) {
const router = useRouter();
const reload = () => {
startTransition(() => {
router.refresh();
reset();
});
};
return (
<div>
{error.message}{" "}
<button onClick={() => startTransition(reload)}>Try again</button>
</div>
);
}
渲染关系

并发路由
在同一个布局内同时渲染多个页面

并行路由在next js中使用定义插槽的形式
创建一个插槽:@folder 的形式创建文件夹名称
每个定义的插槽都会自动成为一个对应的layout.tsx文件的属性

layout中使用插槽
export default function ComplexDashboardLayout({
children,
users,
revenue,
notifications
}: {
children: React.ReactNode;
users: React.ReactNode;
revenue: React.ReactNode;
notifications: React.ReactNode;
}) {
return (
<div>
<div>{children}</div>
<div style={{ display: "flex" }}>
<div style={{ display: "flex", flexDirection: "column" }}>
<div>{users}</div>
<div>{revenue}</div>
</div>
<div style={{ display: "flex", flex: 1 }}>{notifications}</div>
</div>
</div>
)
}
children是一个隐式插槽 不需要定义 传入page.tsx内容
每个插槽都可以处理自己的加载和错误状态



用户可以在默认视图和已存档视图之间切换以查看比较旧的通知
import { Card } from "@/components/card";
import Link from "next/link";
export default function Notifications() {
return (
<Card>
<div>Notifications</div>
<div>
<Link href="/complex-dashboard/archived">Archived</Link>
</div>
</Card>
);
}

这里archived是常规文件夹名称,使用/complex-dashboard/archived可以访问到
import { Card } from "@/components/card";
import Link from "next/link";
export default function ArchivedNotifications() {
return (
<Card>
<div>Archived notifications</div>
<div>
<Link href="/complex-dashboard">Default</Link>
</div>
</Card>
);
}
在两个页面切换 像children一样加载插槽的内容
默认情况下插槽内渲染的内容与当前URL匹配,当通过导航(点击链接跳转)时,没有匹配的插槽时,nextjs会显式之前不匹配的插槽中的内容。
也就是,在默认和已归档的通知之间切换时,其他三个插槽(children、user、revenue)保持不变,并不受URL路径切换的影响。
但是如果刷新页面 没有匹配到就会404错误,因为没有匹配对应的URL的插槽也没设置default.tsx文件,每一个插槽都需要设置一个default.tsx
条件路由
export default function ComplexDashboardLayout({
children,
users,
revenue,
notifications,
login,
}: {
children: React.ReactNode;
users: React.ReactNode;
revenue: React.ReactNode;
notifications: React.ReactNode;
login: React.ReactNode;
}) {
const isLoggedIn = true;
return isLoggedIn ? (
<div>
<div>{children}</div>
<div style={{ display: "flex" }}>
<div style={{ display: "flex", flexDirection: "column" }}>
<div>{users}</div>
<div>{revenue}</div>
</div>
<div style={{ display: "flex", flex: 1 }}>{notifications}</div>
</div>
</div>
) :
// 条件路由 显式登陆
login
);
}
拦截路由
从当前路径跳转目标路径,如要拦截同名路径需要按照以下规则在当前路径创建文件夹
- 拦截同级路径:(.) + 文件夹名称
- 拦截上一级路径:(..) + 文件夹名称
- 拦截上两级路径:(..)(..) + 文件夹名称
- 拦截根路径:(...) + 文件夹名称