【问题标题】:React Router not rendering component at path, returns blank page with correct pathingReact Router 不在路径处渲染组件,返回具有正确路径的空白页面
【发布时间】:2019-09-18 17:37:42
【问题描述】:

React-Router 似乎在我的应用程序中工作,除了我得到一个空白页面而不是我的组件这一事实,即使它被定向到正确的路径。

我正在扫描文档,但在查看并搜索 Google/此站点后,我无法自行解决问题。

我试过...

  • 让 router.js 文件只包含路由,以便获得相同的结果。这样做时还要指定确切的路径。
  • 将 react-router-dom 重新安装到组件中,以防下载时出错。
  • 删除提供程序以防出现问题
  • 将router文件中的代码直接放在provider组件标签之间的App.js文件中

这些是涉及的文件。

Router.js

import React from 'react';
import {Route, Switch, Redirect} from 'react-router-dom';
import LandingPage from '../scenes/LandingPage';
import CityPage from '../scenes/CityPage';

const Router = () => {
    return ( 
        <Switch>
            <Redirect from='/' to='/landing' />
            <Route path='/landing' component={LandingPage} />
            <Route path='/citypage' component={CityPage} />
        </Switch>
     );
}

export default Router;

App.js

import React from "react";
import { BrowserRouter } from "react-router-dom";
import Router from "./services/Router";
import ChosenCityContextProvider from "./services/context/ChosenCityContext";

const App = () => {
  return (
    <BrowserRouter>
      <ChosenCityContextProvider>
        <Router />
      </ChosenCityContextProvider>
    </BrowserRouter>
  );
};

export default App;

网站呈现时没有错误消息。除了空白页,其他一切似乎都在工作。在 React Dev 工具中,它声明 Router.Consumer 有一个对象,该对象在展开时显示为空。

我的代码有什么问题?

https://codesandbox.io/s/youthful-maxwell-rch1k?fontsize=14

上面是代码沙盒。我这里也有同样的问题

【问题讨论】:

  • 您能否将 jsfidle 链接包含到您的问题中。调试代码很容易:)
  • 我会真正快速地制作一个沙盒
  • 我不确定为什么会这样,但如果您添加 exact,您的页面会在沙箱中呈现。
  • @DLowther 请写一个答案,这样我就可以给你积分。我将您的解决方案放在我的问题的答案中,但我想接受您的回答,因为我没有想到这一点

标签: reactjs react-router


【解决方案1】:

我不确定为什么这能解决问题,但我在一个工作项目中遇到过这个问题,所以知道它有效。

如果您将exact 添加到重定向元素中,它会强制执行正确的行为。

import React from 'react';
import {Route, Switch, Redirect} from 'react-router-dom';
import LandingPage from '../scenes/LandingPage';
import CityPage from '../scenes/CityPage';

const Router = () => {
    return ( 
        <Switch>
            <Redirect exact from='/' to='/landing' />
            <Route path='/landing' component={LandingPage} />
            <Route path='/citypage' component={CityPage} />
        </Switch>
     );
}

export default Router;

【讨论】:

  • 非常感谢@DLowther 的帮助。考虑到路径是否完全匹配,我也不确定,但我很感激能解决我的问题。我读过“来自”在文档中被视为“路径”。所以我理解这一点,但不知道为什么共享名称不足以使其正常工作
  • 这里是关于“精确”的很好的解释。 reacttraining.com/react-router/web/api/Route/exact-bool。但我很好奇@A-Bro 的例子是如何“精确”工作的。没有同名的路由器。如果有人知道这一点,请向我们解释:)
  • @Jargal 感谢您提供有用的链接 Jargal。链接指向页面,因此组件没有显示的事实确实令人费解
【解决方案2】:

我试过了,效果很好。我不知道为什么之前没有。如果有人有解释,请告诉我,因为我正在努力了解我最初做错了什么。


            <Route render={() => <Redirect from='/' to='/landing' />} />

我添加了上面的,所以我的路由器文件看起来像这样。


import React from 'react';
import {Route, Switch, Redirect} from 'react-router-dom';
import LandingPage from '../scenes/LandingPage';
import CityPage from '../scenes/CityPage';

const Router = () => {
    return ( 
        <Switch>
            <Route path='/landing' component={LandingPage} />
            <Route path='/citypage' component={CityPage} />
            <Route render={() => <Redirect from='/' to='/landing' />} />
        </Switch>
     );
}

export default Router;

@DLowther 还向我展示了另一个解决方案

import React from "react";
import { Route, Switch, Redirect } from "react-router-dom";
import Page from "./Page";
import Home from "./Home";

const Router = () => {
  return (
    <Switch>
      <Redirect exact from="/" to="/home" />
      <Route path="/home" component={Home} />
      <Route path="/page" component={Page} />
    </Switch>
  );
};

export default Router;

我想感谢这个人回答了我的问题

【讨论】:

  • 渲染方法在很多情况下也非常有用。我们使用它来检测私有路由(您可以提取包装组件),并有条件地呈现登录屏幕或请求的路由。
  • 感谢您提供更多信息@DLowther!我很高兴知道这种特定格式的不同用例。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2018-05-25
  • 2022-01-23
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
相关资源
最近更新 更多