【问题标题】:Component not rendering after using <Link> on click单击时使用 <Link> 后组件未呈现
【发布时间】:2021-05-05 03:57:01
【问题描述】:

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

我在 App.js 中设置了一个 &lt;Switch&gt; 和多个 Routes 来将组件重定向和链接在一起。 App.js 中的第一个&lt;Redirect&gt; 转到ComponentA,当单击div 时,它应该转到ComponentB,但事实并非如此。经过一番摆弄,我可以让ComponentB 进行渲染,但它与ComponentA 是一致的,现在有了更多的变化,除了标题.../componentB 之外什么都没有显示。

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>
  );
}

【问题讨论】:

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


    【解决方案1】:

    问题

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

    解决方案

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

    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 组件梳理您的代码并将它们删除,因为这些会像上面解释的那样混淆导航。

    【讨论】:

    • 好吧,很明显,当我第一次点击它时,什么都没有,但是当我返回然后再次点击时,我可以查看所有内容。这种行为有什么合乎逻辑的解释吗?
    • @ShlokJain 如果您仍然无法让这些组件和链接正常工作,那么我邀请您尝试创建一个 running 代码框来重现导航问题,我可以采取更好看。
    • 不不,我查看了整个模块并发现,我在 ComponentC 中声明了另一个 &lt;Router&gt;。讽刺吧(导致组件 A/B 的过程也是通过 C)
    • @ShlokJain 太好了!如果我的回答足以帮助解决您的问题,那么我邀请您将其标记为已接受的答案,如果它和解释有帮助,那么请不要忘记投票。干杯。
    • 不,我还没有编程,但我很想知道这个问题是否会出现
    猜你喜欢
    • 2019-06-04
    • 2017-10-12
    • 2021-04-13
    • 2021-01-05
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多