单击使用 <Link> 后组件未呈现

Component not rendering after using <Link> on click

我是 React JS 的新手,如果这个问题看起来微不足道,我很抱歉。

我在 App.js 中设置了一个 <Switch> 和一些 Routes 来重定向和 link 组件。 App.js 中的第一个 <Redirect> 转到 ComponentA,当单击 div 时,它应该转到 ComponentB,但事实并非如此。经过一番摆弄后,我可以让 ComponentB 进行渲染,但它与 ComponentA 是一致的,现在有了更多更改,除了 header .../componentB.[=22 什么都没有显示=]

App.js

import { ComponentA, ComponentB } from './components/Component.js';
import { BrowserRouter as Router, Route, Redirect, Switch} from 'react-router-dom';

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  
  return (
    <div>
      <Router exact path="/">
        <Switch>
          <Route exact path="/componentA" component={ComponentA}/>
          <Route exact path="/componentB" component={ComponentB}/>      
          <Route exact path="/componentC" component={ComponentC}/>  
        </Switch>  
        {isLoggedIn ? <Redirect to="/componentA"/> : <Redirect to="/componentC"/>}
        // componentC is irrelevant to the question
      </Router>
    </div>
  );
}

组件A

import { BrowserRouter as Router, Route, Redirect, Switch} from 'react-router-dom';

function ComponentA() {  
  return (
    <div>
      <Router exact path="/">
        // ... code
        <Link exact to="/componentB">
           <div></div>
        </Link>
      </Router>
    </div>
  );
}

ComponentB(与 ComponentA 在同一个文件中)

function ComponentB() {
  return (
    <div>Welcome to ComponentB</div>
  );
}

问题

我认为 ComponentA 中呈现的第二个 Router 组件正在劫持 link 导航。这个“内部”路由上下文处理导航请求并更新地址栏中的 URL 但不允许“外部”路由上下文看到更改并更新匹配和呈现的 Route .

解决方案

删除 ComponentA 中的 Router,同时删除 Link 中的 exact 属性,因为它不是 link 属性。

import { Link } from 'react-router-dom';

function App() {  
  return (
    <div>
      // ... code
      <Link to="/componentB">
        <div></div>
      </Link>
    </div>
  );
}

Router 中删除 exactpath 属性,这些是 Route 组件的属性。

import { ComponentA, ComponentB } from './components/Component.js';
import { BrowserRouter as Router, Route, Redirect, Switch} from 'react-router-dom';

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  
  return (
    <div>
      <Router>
        <Switch>
          <Route exact path="/componentA" component={ComponentA}/>
          <Route exact path="/componentB" component={ComponentB}/>      
          <Route exact path="/componentC" component={ComponentC}/>  
        </Switch>  
        {isLoggedIn ? <Redirect to="/componentA"/> : <Redirect to="/componentC"/>}
        // componentC is irrelevant to the question
      </Router>
    </div>
  );
}

更新

您的应用程序只需要一个路由上下文,通常是包装 App 组件的 Router。梳理任何其他嵌套 Router 组件的代码并删除它们,因为这些会扰乱导航,如上所述。