pin_drop当前位置:知识文库 ❯ 图文

框架集成:20 框架路由与HTML - 详细教程与实战指南

一、教程简介

单页应用(SPA)的路由系统是现代前端框架的核心功能之一。与传统的多页应用通过服务端路由不同,SPA路由在客户端实现页面切换,无需刷新整个页面。本教程将介绍SPA路由原理、HTML5 History API、以及React Router、Vue Router、Angular Router、Svelte Router的路由实现方式,包括动态路由、路由守卫和嵌套路由。


二、SPA路由原理

Hash模式与History模式

代码示例

// 两种路由模式:

// 1. Hash模式(兼容性好)
// URL: http://example.com/#/about
// 监听 hashchange 事件
window.addEventListener('hashchange', () => {
  const path = window.location.hash.slice(1);
  renderPage(path);
});

// 2. History模式(推荐,URL更美观)
// URL: http://example.com/about
// 使用 HTML5 History API
history.pushState(state, '', '/about');  // 推入历史
history.replaceState(state, '', '/about'); // 替换当前
window.addEventListener('popstate', () => {
  renderPage(location.pathname);
});

// History API核心方法:
// history.pushState()    - 添加历史记录
// history.replaceState() - 替换当前记录
// history.back()         - 后退
// history.forward()      - 前进
// history.go(n)          - 跳转n步

// 服务端配置(History模式必须)
// 所有路由都返回index.html,让前端路由接管
// Nginx: try_files $uri $uri/ /index.html;

提示:History模式需要服务端配置,所有路由都需返回index.html,否则刷新页面会出现404错误。


三、各框架路由对比

特性 React Router Vue Router Angular Router SvelteKit
路由模式 组件式 配置式 配置式 文件式
动态路由 /user/:id /user/:id /user/:id /user/[id]
嵌套路由 Outlet router-view router-outlet Slot
路由守卫 自定义Hook beforeEach CanActivate +page.ts
懒加载 lazy+Suspense () => import() loadChildren 自动
编程导航 useNavigate router.push router.navigate goto()

四、React Router

代码示例

// React Router v6
import { BrowserRouter, Routes, Route, Link, useParams, useNavigate } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">首页</Link>
        <Link to="/about">关于</Link>
        <Link to="/users">用户</Link>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/users" element={<UserList />}>
          <Route path=":id" element={<UserDetail />} />  {/* 嵌套路由 */}
        </Route>
        <Route path="*" element={<NotFound />} />  {/* 404 */}
      </Routes>
    </BrowserRouter>
  );
}

// 动态路由参数
function UserDetail() {
  const { id } = useParams();  // 获取 :id
  return <h1>用户 {id}</h1>;
}

// 编程式导航
function LoginForm() {
  const navigate = useNavigate();
  const handleLogin = () => {
    // 登录成功后跳转
    navigate('/dashboard', { replace: true });
  };
}

// 路由守卫(自定义)
function ProtectedRoute({ children }) {
  const isAuthenticated = useAuth();
  if (!isAuthenticated) return <Navigate to="/login" />;
  return children;
}

// 懒加载
const Dashboard = React.lazy(() => import('./Dashboard'));
<Suspense fallback={<Loading />}>
  <Route path="/dashboard" element={<Dashboard />} />
</Suspense>

五、Vue Router

代码示例

// Vue Router 4
import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  { path: '/', component: () => import('./views/Home.vue') },
  { path: '/about', component: () => import('./views/About.vue') },
  { path: '/users/:id', component: UserDetail, props: true },
  {
    path: '/admin',
    component: AdminLayout,
    children: [  // 嵌套路由
      { path: '', component: AdminHome },
      { path: 'users', component: AdminUsers },
    ],
    meta: { requiresAuth: true }  // 路由元信息
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 路由守卫
router.beforeEach((to, from) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    return '/login';  // 重定向
  }
});

// 组件中使用
import { useRouter, useRoute } from 'vue-router';
const router = useRouter();
const route = useRoute();
router.push('/users/' + userId);
console.log(route.params.id);

// 模板中
<router-link to="/about">关于</router-link>
<router-view />  <!-- 路由出口 -->

六、Angular Router与SvelteKit

Angular Router

代码示例

// Angular Router
const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'users/:id', component: UserDetailComponent },
  {
    path: 'admin',
    component: AdminComponent,
    canActivate: [AuthGuard],  // 路由守卫
    children: [
      { path: '', component: AdminHomeComponent },
      { path: 'users', component: AdminUsersComponent },
    ],
  },
  { path: '**', component: NotFoundComponent },  // 404
];

// 模板中
<a routerLink="/about" routerLinkActive="active">关于</a>
<router-outlet></router-outlet>  <!-- 路由出口 -->

// 编程导航
constructor(private router: Router) {}
this.router.navigate(['/users', userId]);

SvelteKit文件系统路由

代码示例

// SvelteKit(文件系统路由)
// src/routes/
//   +page.svelte       → /
//   about/+page.svelte → /about
//   users/[id]/+page.svelte → /users/:id
//   +layout.svelte     → 布局组件

// 页面组件
<script>
  export let data;  // 从+page.ts加载的数据
</script>
<h1>{data.user.name}</h1>

// +page.ts(数据加载)
export async function load({ params }) {
  const user = await getUser(params.id);
  return { user };
}

// 导航
import { goto } from '$app/navigation';
goto('/about');

// 链接
<a href="/about">关于</a>  <!-- SvelteKit自动拦截 -->

七、浏览器兼容性

特性 Chrome Firefox Safari Edge 说明
Hash路由 全部 全部 全部 全部 hashchange事件
History API 32+ 32+ 7.1+ 12+ pushState/replaceState
popstate事件 32+ 32+ 7.1+ 12+ 前进/后退检测
React Router 60+ 60+ 12+ 79+ 依赖React
Vue Router 60+ 60+ 12+ 79+ 依赖Vue 3
SvelteKit 60+ 60+ 12+ 79+ 依赖现代API

八、注意事项与最佳实践

  • History模式需服务端配置:所有路由都需返回index.html

  • 使用路由守卫保护页面:未登录用户重定向到登录页

  • 路由懒加载:大型应用按路由拆分代码,减少首屏加载时间

  • 404路由放最后:通配符路由必须放在路由配置的最后

  • 避免硬编码URL:使用路由的命名路由或路径生成函数

  • 滚动行为:路由切换时重置滚动位置到顶部


九、常见问题与解决方案

常见问题

Hash模式和History模式怎么选?

History模式URL更美观(无#号),是推荐方式,但需要服务端配置。Hash模式兼容性好,无需服务端配置,适合静态部署。新项目推荐History模式。

SPA路由对SEO有什么影响?

纯客户端路由的SPA对SEO不友好,搜索引擎爬虫可能无法正确索引页面。解决方案:使用SSR/SSG(Next.js/Nuxt.js/SvelteKit),或预渲染。

如何实现路由权限控制?

React使用自定义Hook或高阶组件;Vue使用beforeEach守卫;Angular使用CanActivate守卫;SvelteKit使用+page.ts的load函数。

嵌套路由的用途是什么?

嵌套路由用于页面布局复用,如管理后台的侧边栏+内容区域,侧边栏不变,内容区域根据子路由切换。

路由切换时如何保持状态?

使用全局状态管理(Redux/Pinia/NgRx/Store)保存跨路由状态,或使用keep-alive(Vue)/缓存组件(React)保持组件状态。


十、总结

本教程介绍了框架路由与HTML的关系。SPA路由通过Hash模式或History API实现客户端页面切换,无需刷新整个页面。React Router使用组件式路由配置,Vue Router使用配置式路由,Angular Router提供完整的路由守卫系统,SvelteKit使用文件系统路由自动生成路由配置。动态路由、嵌套路由、路由守卫和懒加载是各框架路由系统的共同特性。理解路由原理和各框架的路由实现,是构建大型SPA应用的基础。

标签: SPA路由 React Router Vue Router Angular Router SvelteKit 路由守卫 动态路由 嵌套路由

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: 框架集成:19 Svelte模板与HTM - 详细教程与实战指南 下一篇: 框架集成:21 框架状态管理与HTML - 详细教程与实战指南

poll相关推荐