学习记录-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 编程式跳转
相关推荐
Moment1 小时前
🏞 JavaScript 提取 PDF、Word 文档图片,非常简单,别再头大了!💯💯💯
前端·javascript·react.js
鱼樱前端1 小时前
React 16 到 React 19 基础语法、API 对比与最佳实践
前端·react.js
周努力.2 小时前
关于Vue/React中Diffing算法以及key的作用
javascript·vue.js·react.js
乐闻x4 小时前
React 如何实现组件懒加载以及懒加载的底层机制
前端·react.js·性能优化·前端框架
程序猿--豪5 小时前
前端技术百宝箱
javascript·vue.js·react.js·webpack·gitee·css3·html5
每天吃饭的羊5 小时前
React 性能优化
前端·javascript·react.js
颜酱7 小时前
后台系统从零搭建(三)—— 具体页面之菜单管理和角色管理
前端·javascript·react.js
JustHappy8 小时前
学会Vue上手React需要多久?我来试试?(比较一下Vue和React的基础业务模型的写法)
vue.js·react.js
一朵好运莲8 小时前
Next+React项目启动慢刷新慢的解决方法
前端·react.js·前端框架
崔璨11 小时前
实现一个精简React -- 利用update函数,实现useState(9)
前端·react.js