React Router изменяет ссылку, но не отображает правильный компонент

Здравствуйте, я работаю с 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;

person Haseeb Burki    schedule 05.08.2017    source источник
comment
Как вы обслуживаете свое приложение?   -  person Win    schedule 05.08.2017
comment
на localhost ... через этот командный узел ./node_modules/webpack-dev-server/bin/webpack-dev-server.js   -  person Haseeb Burki    schedule 05.08.2017
comment
Я попытался использовать тег Link в файле компонента ... это игра мне эту ошибку. Неудачные типы контекста: требуемый контекст router.push не был указан в Link. Проверьте метод рендеринга HomeComponent.   -  person Haseeb Burki    schedule 05.08.2017


Ответы (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'));

person Win    schedule 05.08.2017
comment
Спасибо ... Надо было поместить ‹BrowserRouter› в index.js - person Haseeb Burki; 05.08.2017