到达路由器导航更新URL,但不包含组件

时间:2019-08-27 15:36:15

标签: javascript reach-router

我正在尝试让Reach Router从我的一个组件进行编程导航。该URL已按预期更新,但是未呈现该路由,如果我查看React开发人员工具,可以看到原始组件被列为正在显示。

如果我在新的URL刷新页面一次,则页面将正确呈现。

如何获取它以渲染新路线?

下面显示了一个简化的示例,我正在使用@reach/router@1.2.1(使用Redux可能也很明显)。

import React from 'react';

import { navigate } from '@reach/router';

const ExampleComponent = props => {
  navigate('/a/different/url');

  return <div />;
};

export default ExampleComponent;

4 个答案:

答案 0 :(得分:2)

是否可以将 @ reach /路由器 redux-first-history 结合使用?因为我遇到了同样的问题,并且可以通过对historyContext进行以下配置来解决此问题:

import { globalHistory } from "@reach/router";
// other imports

const historyContext = createReduxHistoryContext({
   // your options...
   reachGlobalHistory: globalHistory // <-- this option is the important one that fixed my issue
}

README of redux-first-history

中对此有更多了解

答案 1 :(得分:1)

当我刚开始接触Reach Router时,我也会遇到相同的问题。幸运的是,不久后找到了解决方案。

navigate的内部到达路由器文档中指出:

Navigate返回一个诺言,因此您可以等待它。它可以在React完全完成渲染下一个屏幕后解析,即使使用React Suspense。

因此,请使用await navigate()为我工作。

import React, {useEffect} from 'react';
import {useStoreState} from "easy-peasy";
import {useNavigate} from "@reach/router";

export default function Home() {
    const {isAuthenticated} = useStoreState(state => state.auth)
    const navigate = useNavigate()

    useEffect(()=> {
        async function navigateToLogin() {
            await navigate('login')
        }
        if (!isAuthenticated) {
            navigateToLogin()
        }
    },[navigate,isAuthenticated])

    return <div>Home page</div>
}

答案 2 :(得分:0)

我遇到了一个<NotFound defualt />路由组件的同一问题。

这会更改URL,但React本身不会更改:

import React from "react";
import { RouteComponentProps, navigate } from "@reach/router";

interface INotFoundProps extends RouteComponentProps {}

export const NotFound: React.FC<INotFoundProps> = props => {
  // For that it's worth, neither of these worked 
  // as I would have expected
  if (props.navigate !== undefined) {
    props.navigate("/");
  }
  // ...or...
  navigate("/", { replace: true });

  return null;
};

这将更改URL并按照我的期望呈现新路线:

...
export const NotFound: React.FC<INotFoundProps> = props => {
  React.useEffect(() => {
    navigate("/", { replace: true });
  }, []);

  return null;
};

答案 3 :(得分:0)

尝试使用 gatsby 导航。它使用到达路由器。解决了我的问题

从'gatsby'导入{导航}