如何在 React 中正确地使用 useEffect 来监听路由变化并执行副作用?

如何在 React 中正确地使用 useEffect 来监听路由变化并执行副作用?

在 React 应用中(特别是使用 React Router 的场景),当需要在路由变化时执行某些副作用(如埋点、页面标题更新、数据获取等),可以通过监听 location 对象的变化来实现。

正确做法(以 React Router v6 为例):

import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';

function MyApp() {
  const location = useLocation();

  useEffect(() => {
    // 路由变化时执行的副作用
    console.log('当前路径:', location.pathname);
    document.title = `页面 - ${location.pathname}`;
    // 可以在这里发送埋点、重置滚动位置等
  }, [location]); // 依赖 location 对象,确保路径或 search 参数变化时触发

  return <div>...</div>;
}

解析:

  • useLocation() Hook 会返回当前的 location 对象,包含 pathname、search、hash 等信息。
  • 将 location 作为 useEffect 的依赖项,可确保每次 URL 发生变化(包括 query 参数或 hash)时,副作用都会重新执行。
  • 注意不要遗漏依赖项,否则可能导致闭包陷阱或副作用未及时更新。
  • 如果只关心 pathname 变化,也可以写成 [location.pathname],但通常监听整个 location 更稳妥,避免遗漏 search 或 hash 的变化。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: