【问题标题】:React Router changes Link but doesnt render proper componentReact Router 更改链接但未呈现正确的组件
【发布时间】:2017-08-05 15:18:49
【问题描述】:

您好,我正在使用 React Router... 我有两个组件 App.js 和 SideNavComponent。我想单击 SideNavComponent 中的链接并前往正确的组件。

现在,当我单击链接时,它会更改 URL,但不会呈现正确的组件。但是,如果我自己更改 URL,则会呈现正确的视图。

App.js

import React, { Component } from 'react';
import { Col, Well, Panel } from 'react-bootstrap';

import NavbarComponent from './NavbarComponent';
import SideNavComponent from './SideNavComponent';
import Router from './Router';

class App extends Component {
  render() {
    return (
      <div>
        <div className="header">
          <NavbarComponent />
        </div>

        <div className="body">
          <Col md={3}>
            <Well>
              <SideNavComponent />
            </Well>
          </Col>

          <Col md={9}>
            <Panel>
              <Router />
            </Panel>
          </Col>
        </div>

        <div className="footer" />
      </div>
    );
  }
}

export default App;

SideNavComponent

import React, { Component } from 'react';
import { Nav, NavItem } from 'react-bootstrap';
import { Link, BrowserRouter, Switch } from 'react-router-dom';

class SideNavComponent extends Component {
  state = {
    selectedLink: 1
  };

  selectLink(key) {
    this.setState({ selectedLink: key });
  }

  render() {
    return (
        <BrowserRouter>
          <div style={{ flexDirection: 'column' }}>
              <Link to="/">Home</Link>
              <Link to="/device">Device</Link>
              <Link to="/transform">Transformation</Link>
              <Link to="/graph">Graphs</Link>
          </div>
        </BrowserRouter>
    );
  }
}

export default SideNavComponent;

Router.js

import React from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';

import HomeComponent from './pages/HomeComponent';
import DeviceComponent from './pages/DeviceComponent';
import TransformationComponent from './pages/TransformationComponent';
import GraphComponent from './pages/GraphComponent';

const Router = () => {
  return (
    <BrowserRouter>
      <div>
        <Switch>
          <Route path="/device" component={DeviceComponent} />
          <Route path="/transform" component={TransformationComponent} />
          <Route path="/graph" component={GraphComponent} />
          <Route exact path="/" component={HomeComponent} />
        </Switch>
      </div>
    </BrowserRouter>
  );
};

export default Router;

【问题讨论】:

  • 您如何为您的应用程序提供服务?
  • 在本地主机上...通过此命令“ node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js ”
  • 我尝试在组件文件中使用链接标签...它让我遇到了这个错误。 " 失败的上下文类型:所需的上下文 router.push 未在 Link 中指定。检查 HomeComponent 的渲染方法。"​​

标签: reactjs react-router react-router-v4


【解决方案1】:

问题是您有多个浏览器路由器实例并且历史记录变得混乱。您可以通过重新组织应用程序的结构来解决此问题,如下例所示。

// *-----------------------*
// |  MAIN-APP COMPONENT   |
// *-----------------------*

import React, { Component } from "react";
import { Col, Well, Panel } from "react-bootstrap";
import { Route, Switch } from "react-router-dom";

import SideNavComponent from "./SideNavComponent";

const HomeComponent = () => <div>Home</div>;
const GraphComponent = () => <div>Graph</div>;
const DeviceComponent = () => <div>Device</div>;
const TransformationComponent = () => <div>Transformation</div>;

class App extends Component {
  render() {
    return (
      <div>
        <div className="header" />
        <div className="body">
          <Col md={3}>
            <Well>
              <SideNavComponent />
            </Well>
          </Col>
          <Col md={9}>
            <Panel>
              <Switch>
                <Route path="/device" component={DeviceComponent} />
                <Route path="/transform" component={TransformationComponent} />
                <Route path="/graph" component={GraphComponent} />
                <Route exact path="/" component={HomeComponent} />
              </Switch>
            </Panel>
          </Col>
        </div>
        <div className="footer" />
      </div>
    );
  }
}

export default App;

// *-----------------------*
// | SIDENAV-COMPONENT     |
// *-----------------------*

import React, { Component } from "react";
import { Nav, NavItem } from "react-bootstrap";
import { Link } from "react-router-dom";

class SideNavComponent extends Component {
  render() {
    return (
      <div style={{ flexDirection: "column" }}>
        <Link to="/">Home</Link>
        <Link to="/graph">Graphs</Link>
      </div>
    );
  }
}

export default SideNavComponent;

// *-----------------------*
// | MAIN.JS (ENTRY POINT) |
// *-----------------------*

import React from 'react'
import { render } from 'react-dom'
import App from './components/App';
import { BrowserRouter } from 'react-router-dom';

render((
  <BrowserRouter>
    <App />
  </BrowserRouter>
), document.getElementById('root'));

【讨论】:

  • 谢谢...应该把 放在 index.js 中
猜你喜欢
  • 2021-08-10
  • 2020-05-06
  • 2018-04-23
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多