如何为反应路由器编写拦截器?

How to write an interceptor for react router?

我想在调用每个使用 react-router 声明的路由时进行拦截,并在其末尾附加一个查询参数。

这样做的原因是我需要在每条路线的末尾附加一组查询参数,但是由于我目前正在处理大型代码库,所以我无法查看每条路线并将其附加.因此,如果我可以编写一些寻求的拦截器,每次调用路由时都会调用该拦截器,然后在其中附加查询参数并传递请求,这将是理想的。

react-router 有这样的功能吗?我正在使用 react-router v4

我能想到的一种方法是 "enhance" 传递给 Providerhistory 对象...您可以增强 public该对象的方法并在那里添加该功能,基本上你必须 "enhance" pushreplace 方法。大致是这样的:

function pathInterceptor(path) {
  // TODO Your logic here
  // return an enhanced path that ensures that you have the
  // query string that you need
}

function historyEnhancer(originalHistory) {
  return {
    ...originalHistory,
    push: (path, ...args) =>
      originalHistory.push(pathInterceptor(path), ...args),
    replace: (path, ...args) =>
      originalHistory.replace(pathInterceptor(path), ...args),
  };
}

编辑:

看看 this codesandbox 这个想法的例子。

您可以创建自己的 'RouteProvider' 并从顶级观察路线变化 以下内容可能会起作用:

export const RouteParent = ({ match, history }) => {
   useEffect(() => {
       // match object changed, do something
   }, [match])

   return (
       <Switch>
       {/* actual routes here */}
       </Switch>
   )
}