React router:在每个<Link>导航上执行自定义功能

Mat*_*ády 9 javascript reactjs react-router

对不起,如果已经回答了这个问题.但有没有办法在每个<Link>导航上执行自定义功能?最好不要创建自定义<Link>包装器.

我希望在应用程序内的每个导航之前将一些信息提供给sessionStorage.

谢谢

小智 15

我确实在寻找这个答案,但在任何地方都找不到它,然后我做了一些实验,这是我的答案,对我有帮助,所以我想我会分享!

如果你使用React Router 的uselocation钩子。这个钩子为您提供了一个具有关键属性的对象,该属性在每次路由器更改时都会发生变化。然后,您可以创建一个 useEffect 来监视此属性,并在该发生更改时触发一个函数。请参阅下面的示例

const location = useLocation();
useEffect(() => {
    console.log('location', location.key); // { key: "3uu089" }
    // Fire whatever function you need.
    sessionStorage.setItem('whatever', state);

}, [location.key]);
Run Code Online (Sandbox Code Playgroud)

  • 我使用了 `location.pathname` 而不是你建议的。每次更改 url 时都会触发我的“useEffect” (2认同)

ris*_*hat 12

你可以onClick用来执行任何动作

<Link
  to="/"
  onClick={() => console.log('Heading to /')} />
Run Code Online (Sandbox Code Playgroud)

替换console.log为执行sessionStorage更新等功能,就是这样.


另一种方法是使用组件的onEnterprop Route来执行每个路由输入的某个功能:

<Route
  path="/"
  component={App}
  onEnter={() => console.log('Entered /')} />
Run Code Online (Sandbox Code Playgroud)

请参阅参考,或使用react-router和react-redux的示例.

  • 我不想每次使用`&lt;Link&gt;`时都不会写`onClick = {()=&gt; console.log('Heading to /')}`部分。 (3认同)
  • 嘿阿努拉格,谢谢你提出这个问题!那有什么新办法呢?(如果有的话) (2认同)