【问题标题】:React Router works only after refreshing the pageReact Router 仅在刷新页面后才起作用
【发布时间】:2020-10-26 00:14:07
【问题描述】:

我对反应有点陌生,我遇到了路由器问题。 当我直接在浏览器上输入 URL 时,路由工作,但是当我单击链接时,浏览器上的 URL 会发生变化(例如 http://localhost:8080/contactus),但内容没有得到更新(但是如果我进行刷新,它就会更新)。

这是我的 github 仓库: https://github.com/Arefaat18/Project

这是我的 MainComponent.js

import React, { Component } from 'react';
import {TransitionGroup, CSSTransition} from 'react-transition-group';
import {Switch, Route, Redirect,withRouter,BrowserRouter as Router} from 'react-router-dom';
import Header from './HeaderComponent';
import ContactUs from './ContactUsComponent';
import AboutUs from './AboutUsComponent';
import Home from './HomeComponent.js';
import {connect} from 'react-redux';  

class Main extends Component {

  constructor(props) {
    super(props);

  }

  
  
  render() {

    return (
      <div>
        <Router>
        <Header />
        <TransitionGroup>
          <CSSTransition classNames="page" timeout={300}>
            <Switch>
              <Route path="/home" component={Home} />
              <Route exact path = "/contactus" component ={ContactUs} />
              <Route exact path = "/aboutus" component ={AboutUs} />
              <Redirect to="/home" />
            </Switch>
          </CSSTransition>
        </TransitionGroup>
        </Router>
        </div>
    );
  }
}

export default withRouter(Main);

这是我的 App.js 文件

import React, { Component } from 'react';
import Main from './components/MainComponent';
import './App.css';
import {BrowserRouter} from 'react-router-dom';
import {Provider} from 'react-redux';
import {ConfigureStore} from './components/configureStore';

const store = ConfigureStore();

class App extends Component {


  render() {
    return (
      <Provider store={store}>
        <BrowserRouter>
          <div className="App">
            <Main />
          </div>
        </BrowserRouter>
      </Provider>
    );
  }
}

export default App;

这里是相关的依赖项

"react": "^17.0.1",
    "react-bootstrap": "^1.4.0",
    "react-dom": "^17.0.1",
    "react-redux": "^7.2.1",
    "react-redux-form": "^1.16.14",
    "react-router-dom": "^5.2.0",
    "react-scripts": "3.4.4",

这里是我的 ContactUsComponent,其他的组件都是一样的,只是文字不同

import React, { Component } from 'react';

class ContactUs extends Component {

    render(){
        console.log("RENDER");
        return (
            <div>
                <h1> Contact Us</h1>
            </div>
        );
    }
}

export default ContactUs;

提前致谢。

【问题讨论】:

  • 您的路由包含在 2 个路由器中,一个在应用程序文件中,另一个在组件文件中,您只需要 1 个。此外,您只需将实际应用程序作为路由的组件值,即component={Home},你不需要那个内联渲染。你已经用withRouter包裹了组件​​一,如果你在渲染函数中console.log,当你在前端改变路由时它会重新渲染吗?
  • @Jayce444 我尝试删除 MainComponent.js 中的路由器包装器,但结果仍然相同。如果我离开它并删除 App.js 中的包装器,则会出现错误“错误:不变失败:您不应在 之外使用 ”..我按照您的建议放置了 console.log它仅在我刷新页面时打印,而不是在我单击选项卡时打印
  • 这个问题是否仅与“/contactus”路径有关?所有路径?您是否实现了任何类型的页面组件记忆?你能提供你的组件代码吗?是否可以提供一组精确的复制步骤,正是您正在做什么来查看问题?您能否创建一个重现此问题的 running 代码框?除了您可以简单地将组件传递给 component 道具这一事实之外,我在这里看不到任何明显的错误。
  • @DrewReese 没有问题出在所有组件上。我还没有实现页面组件记忆,我真的不知道。我编辑了我的代码以包含我的组件。我还对其进行了编辑以直接传递组件而无需内联样式。
  • 我尝试将尽可能多的代码复制到正在运行的codesandbox 中,它似乎可以正常工作。您可以尝试创建一个您自己的 running 代码框来重现您的问题吗?如果您的项目托管在 github 中,您可以直接导入到代码沙箱中。

标签: javascript reactjs react-router react-router-dom


【解决方案1】:

是的,你声明了无关的Routers,你的标题组件有一个。删除此Router

这是因为每个Router 都提供了一个路由上下文,每个订阅a 路由上下文的组件都从最近的路由器获取上下文。为标头提供上下文的路由器没有渲染任何路由,因此这就是为什么 URL 会更改但渲染 Routes 的路由器实际上没有被通知它应该渲染不同的路径.

class Header extends Component {
  constructor(props) {
    ...
  }

  ...

  render() {
    return (
      <React.Fragment>
        {/* <Router> */} // <-- Remove this Router Component
        <Navbar dark expand="md">
          ...
        </Navbar>
        <Modal isOpen={this.state.isModalOpen} toggle={this.toggleModal}>
          ...
        </Modal>
        {/* </Router> */}
      </React.Fragment>
    );
  }
}

【讨论】:

  • 非常感谢,现在可以使用了!你能解释一下为什么会产生错误吗?
  • @AhmedRefaat 好吧,这本身并不是一个错误,但我认为这是因为每个 Router 都提供了一个路由上下文,并且每个订阅 a 的组件路由上下文从最近的路由器获取上下文。为标头提供上下文的路由器没有呈现任何路由,这就是为什么 URL 会更改但呈现Routes 的路由器实际上没有被通知它应该呈现不同的路径.修改后的答案。
【解决方案2】:

我遇到了类似的问题。我在组件中使用了Link,但我是从@reach/router 导入的。 结果我换了

import { Link } from "@reach/router"

import { Link } from "react-router-dom"

在每个组件中;一切正常

【讨论】:

    【解决方案3】:

    我刚刚完成了 React 前端 Web 开发课程。我认为您也在学习这门课程,所以我认为您的代码没有任何问题,可能问题出在您的 ContactUs 组件中。如果您可以提供您的 ContactUs 代码,那么我可以调试它

    【讨论】:

    • 我实际上完成了该课程并且它工作正常,但是我将路由器部分复制到我的新项目中并且它产生了错误。我使用 ContactUsComponent 编辑了我的帖子。所有其他组件也会发生错误,这些组件相同但

      文本

      不同
    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 2020-10-04
    • 2014-11-16
    • 2015-11-28
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多