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

一、useLocation基础用法

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

javascript 复制代码
{
  pathname: "/about",       // 当前路径
  search: "?name=john",     // 查询参数(URL参数)
  hash: "#contact",         // URL哈希值
  state: { from: "/home" }, // 路由跳转时传递的 state
  key: "abc123"             // 唯一标识当前 location 的 key
}
javascript 复制代码
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、导航高亮(根据路径匹配)

javascript 复制代码
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参数)

javascript 复制代码
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页面浏览追踪(埋点)

javascript 复制代码
function AnalyticsTracker() {
  const location = useLocation();

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

  return null;
}

三、useLocation进阶用法

1、结合 useEffect 监听路由变化

javascript 复制代码
function ScrollToTop() {
  const location = useLocation();

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

  return null;
}

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

javascript 复制代码
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 传递隐式数据

javascript 复制代码
// 跳转时传递 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 对比

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

javascript 复制代码
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>
  );
}

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

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端