当前位置: 首页 > news >正文

React 第三十四节 Router 开发中 useLocation Hook 的用法以及案例详解

一、useLocation基础用法

作用:获取当前路由的 location 对象
返回对象结构:

{pathname: "/about",       // 当前路径search: "?name=john",     // 查询参数(URL参数)hash: "#contact",         // URL哈希值state: { from: "/home" }, // 路由跳转时传递的 statekey: "abc123"             // 唯一标识当前 location 的 key
}
import { useLocation } from 'react-router-dom';function CurrentPath() {const location = useLocation();return (<div><h2>当前路径信息:</h2><p>路径:{location.pathname}</p><p>参数:{location.search}</p><p>哈希:{location.hash}</p><p>State数据:{JSON.stringify(location.state)}</p></div>);
}

二、useLocation核心使用场景

1、导航高亮(根据路径匹配)

function NavLink() {const location = useLocation();return (<nav><Link to="/" className={location.pathname === '/' ? 'active' : ''}>首页</Link><Link to="/about" className={location.pathname.startsWith('/about') ? 'active' : ''}>关于我们</Link></nav>);
}

2、useLocation获取查询参数(URL参数)

function UserList() {const location = useLocation();const searchParams = new URLSearchParams(location.search);const page = searchParams.get('page') || 1;const filter = searchParams.get('filter') || 'all';// 根据 page 和 filter 请求数据useEffect(() => {fetchData({ page, filter });}, [location.search]); // 监听 URL 参数变化return <div>{/* 渲染列表 */}</div>;
}

3、useLocation页面浏览追踪(埋点)

function AnalyticsTracker() {const location = useLocation();useEffect(() => {// 每次路由变化时发送统计analytics.trackPageView(location.pathname);}, [location]);return null;
}

三、useLocation进阶用法

1、结合 useEffect 监听路由变化

function ScrollToTop() {const location = useLocation();useEffect(() => {// 每次路由变化时滚动到顶部window.scrollTo(0, 0);}, [location.pathname]); // 仅在路径变化时触发return null;
}

2、解析复杂查询参数(推荐使用 URLSearchParams

const searchParams = new URLSearchParams(location.search);
const params = Object.fromEntries(searchParams.entries());// 示例 URL: /products?category=electronics&price=100-500
// 输出:{ category: 'electronics', price: '100-500' }

3、 通过 state 传递隐式数据

// 跳转时传递 state
<Link to="/checkout" state={{ from: 'cart', discount: 20 }}>去结算</Link>// 目标组件接收
function CheckoutPage() {const location = useLocation();const { from, discount } = location.state || {};
}

四、useLocation使用注意事项

1、不可在类组件中使用
useLocation 是 React Hook,只能在函数组件或自定义 Hook 中使用

2、避免直接修改 location 对象
该对象是只读的,修改不会影响实际路由
3、state 安全性
通过 location.state 传递的数据会存储在浏览器历史记录中,敏感数据应避免使用

4、Key 的特性
每个 location.key 唯一标识一次导航,可用于跟踪用户历史操作

五、与相关 API 对比

在这里插入图片描述

完整示例:带参数过滤的商品列表

function ProductList() {const location = useLocation();const navigate = useNavigate();const searchParams = new URLSearchParams(location.search);// 获取参数const category = searchParams.get('category') || 'all';const sort = searchParams.get('sort') || 'price_asc';// 模拟数据过滤const filteredProducts = filterProducts(category, sort);// 更新 URL 参数const handleFilterChange = (newCategory) => {const params = new URLSearchParams(location.search);params.set('category', newCategory);navigate({ search: params.toString() });};return (<div><FilterControls currentCategory={category}onChange={handleFilterChange}/><ProductGrid products={filteredProducts} /></div>);
}

注:如有错误地方,欢迎批评指正

http://www.dtcms.com/a/162780.html

相关文章:

  • 初识Redis · 缓存
  • git配置SSH KEY
  • 怎么查自己手机连接的ip归属地:完整指南
  • JAVA-使用Apache POI导出数据到Excel,并把每条数据的图片打包成zip附件项
  • 项目三 - 任务2:创建笔记本电脑类(一爹多叔)
  • 飞鸟游戏模拟器 1.0.3 | 完全免费无广告,内置大量经典童年游戏,重温美好回忆
  • Rust Ubuntu下编译生成环境win程序踩坑指南
  • MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的?
  • Git操作指令
  • 技术驱动与模式创新:开源AI大模型与S2B2C商城重构零售生态
  • C++ 类和对象(3)初始化列表、友元函数、内部类
  • 【Prometheus-MySQL Exporter安装配置指南,开机自启】
  • 如何利用Rust提升Linux服务器效率(详细操作指南)
  • 【神经网络与深度学习】改变随机种子可以提升模型性能?
  • JavaScript 实现——已知x值和y值,求其线性关系
  • 数据结构入门:详解顺序表的实现与操作
  • 算法设计:分支限界法的基础原理与应用
  • Prometheus监控
  • ARP渗透学习1
  • TCP概念+模拟tcp服务器及客户端
  • 数据库系统概论(六)详细讲解关系代数(利用简单到难的层次带你一步一步掌握)
  • AI遇见端动态神经网络:Cephalon(联邦学习+多模态编码)认知框架构建
  • 【MongoDB篇】MongoDB的集合操作!
  • 深入蜂窝物联网 第五章 EC-GSM-IoT 及其他技术:混合组网与前瞻
  • 玩玩OCR
  • 《阿里Qwen3开源:AI新纪元的破晓之光》
  • 2025年深圳软件开发公司推荐
  • 当向量数据库与云计算相遇:AI应用全面提速
  • 论文笔记-基于多层感知器(MLP)的多变量桥式起重机自适应安全制动与距离预测
  • 【C#】.net core6.0无法访问到控制器方法,直接404。由于自己的不仔细,出现个低级错误,这让DeepSeek看出来了,是什么错误呢,来瞧瞧