学习记录-react-router&基础篇

React-Router 的工作原理

React-Router 是 React 官方提供的前端路由解决方案,它的核心原理是:
通过监听 URL 地址变化,动态渲染对应的组件,从而实现页面的跳转和切换

React-Router 的核心原理

React-Router 通过以下核心机制实现路由跳转:

1. 基于 History API 或 Hash 实现 URL 变化

React-Router 支持两种路由模式:

模式 实现原理
Hash 模式 使用 window.location.hash 监听 URL 变化实现页面跳转。地址带 #,如:http://localhost:3000/#/home
History 模式 使用 window.history.pushState / window.history.replaceState 修改 URL,实现无刷新跳转。地址无 #,如:http://localhost:3000/home

2. 监听 URL 地址变化

React-Router 内部通过事件监听 来感知 URL 变化:#### Hash 模式

  • 监听 window.onhashchange 事件,当 location.hash 变化时,重新渲染对应的页面组件。
javascript 复制代码
window.onhashchange = () => {
  console.log('地址变化了', window.location.hash);
}

History 模式

  • 通过 popstate 事件监听 URL 变化:
javascript 复制代码
window.onpopstate = (event) => {
  console.log('地址变化了', window.location.pathname);
}
  • 通过 pushState / replaceState 修改 URL:
javascript 复制代码
window.history.pushState({}, '', '/about');

History 模式更优雅 ,但需要后端配合配置 404 重定向

3. Route 通过 URL 匹配组件

React-Router 内部通过 路径匹配找到对应的组件:

ini 复制代码
<Route path="/home" element={<Home />} />
<Route path="/about" element={<About />} />

匹配原理:

ini 复制代码
const path = window.location.pathname;
if (path === '/home') render(<Home />);
if (path === '/about') render(<About />);

React-Router 提供了 <Link />useNavigate() 进行跳转:

  • 通过 window.history.pushState() 修改 URL:
ini 复制代码
<Link to="/about">跳转关于页面</Link>
  • useNavigate() 通过 pushState 实现跳转:
ini 复制代码
import { useNavigate } from 'react-router-dom';

const Home = () => {
  const navigate = useNavigate();
  return <button onClick={() => navigate('/about')}>跳转</button>;
}

原理 :跳转页面时不刷新页面,只修改 URL,React-Router 自动渲染对应的组件。

5. 动态路由匹配

React-Router 支持动态路由匹配: <Route path="/user/:id" element={} /> 访问 /user/123 会匹配:

javascript 复制代码
import { useParams } from 'react-router-dom';

const User = () => {
  const { id } = useParams();
  return <h1>用户ID: {id}</h1>;
}

匹配原理:

ini 复制代码
const path = window.location.pathname; // /user/123
const match = /^\/user\/(\d+)$/.exec(path);
if (match) render(<User id={match[1]} />);

6. 路由守卫 (Navigation Guard)

React-Router 通过 useEffectNavigate 实现路由守卫:

  • 未登录跳转登录页
javascript 复制代码
import { useNavigate } from 'react-router-dom';

const Dashboard = () => {
  const navigate = useNavigate();
  
  useEffect(() => {
    if (!localStorage.getItem('token')) {
      navigate('/login');
    }
  }, []);
  
  return <h1>欢迎进入系统</h1>;
}

原理:

  • 页面加载时检查 localStorage 是否存在 token
  • 如果不存在,调用 navigate() 重定向至登录页。

React-Router-Dom 组件介绍

以下是 React-Router-Dom 常用的核心组件:

1. BrowserRouter (必须包裹根组件)

BrowserRouter 提供基于 History 模式的路由功能:

javascript 复制代码
import { BrowserRouter } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </BrowserRouter>
  );
}

📌 2. HashRouter (基于 Hash 模式)

HashRouter 使用 # 实现路由跳转:

javascript 复制代码
jsx
复制编辑
import { HashRouter } from 'react-router-dom';

function App() {
  return (
    <HashRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </HashRouter>
  );
}

特点:

  • URL 带 #http://localhost:3000/#/home
  • 优点:无后端配置,前端直接可用。
  • 缺点:URL 不优雅,SEO 差。

📌 3. Route (定义路由)

Route 负责匹配 URL并渲染对应组件:

ini 复制代码
jsx
<Route path="/home" element={<Home />} />
<Route path="/about" element={<About />} />
  • path:路径
  • element:渲染组件

📌 4. Routes (包裹所有路由)

✅ React 18+ 必须使用 Routes 包裹 Route

xml 复制代码
<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/about" element={<About />} />
</Routes>

特点:

  • React 18 强制要求 Route 必须包裹在 Routes 内部。

Link 用于代替 <a> 标签:

ini 复制代码
jsx
<Link to="/about">关于</Link>
  • 不刷新页面
  • 修改 URL 地址

底层原理:

javascript 复制代码
window.history.pushState({}, '', '/about');

📌 6. useNavigate (编程式跳转)

useNavigate() 替代 useHistory()

ini 复制代码
import { useNavigate } from 'react-router-dom';

const Home = () => {
  const navigate = useNavigate();
  return (
    <button onClick={() => navigate('/about')}>
      跳转关于页面
    </button>
  );
}
  • 内部调用:
javascript 复制代码
window.history.pushState({}, '', '/about');

📌 7. useParams (获取动态参数)

✅ 获取 URL 参数:

ini 复制代码
jsx
复制编辑
<Route path="/user/:id" element={<User />} />
javascript 复制代码
jsx
复制编辑
import { useParams } from 'react-router-dom';

const User = () => {
  const { id } = useParams();
  return <h1>ID: {id}</h1>;
}
  • 访问 /user/123id 就是 123

✅ 类似 window.location.replace

javascript 复制代码
import { Navigate } from 'react-router-dom';

if (!localStorage.getItem('token')) {
  return <Navigate to="/login" />;
}
  • 内部调用:
javascript 复制代码
window.location.replace('/login');

✅ 总结

组件 作用
BrowserRouter History 模式
HashRouter Hash 模式
Route 定义路由
Routes 包裹所有路由
Link 跳转页面
useNavigate 编程式跳转
相关推荐
前端付豪8 小时前
🚀 2025 年 React 全攻略:40 个高频问题深度解析与实战指南
前端·react.js
洋339 小时前
[纯原创无Ai] 我把React调教成vue的模样了
vue.js·react.js
Aiolimp10 小时前
React JSX 基本用法
前端·react.js
高峰君主10 小时前
跨端时代的全栈新范式:React Server Components深度集成指南
前端·react.js·前端框架
萌萌哒草头将军12 小时前
🚀🚀🚀 神了!RedwoodJS 轻松碾压 NextJS,成了我的最爱❤️
前端·react.js·全栈
Aiolimp15 小时前
React Router V7 基本使用
前端·react.js
三思而后行,慎承诺16 小时前
详解React Fiber架构中,reconcile阶段的具体工作流程
javascript·react.js·ecmascript
进取星辰16 小时前
14、服务端组件:未来魔法预览——React 19 RSC实践
前端·react.js·前端框架
JiangJiang16 小时前
🧠 面试官:受控组件都分不清?还敢说自己写过 React?
前端·react.js·面试
喵爱吃鱼16 小时前
原来这就是react设计模式啊
前端·javascript·react.js