反应不渲染路线组件

时间:2019-09-05 12:01:17

标签: reactjs react-router react-component

我正在使用管理仪表板构建面向消费者的应用程序。我想为他们分开路由,所以尝试委托:-

App.js

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

//styles
import './style/bootstrap/bootstrap.scss';

//apps
import Mainapp from './mainapp/Mainapp';
import Admin from './admin/Admin';

const MainappContainer = () => (
  <Mainapp />
);

const AdminContainer = () => (
  <Admin />
);

class App extends Component{
  render(){
    return (
      <Router>
        <Switch>
            <Route path="/admin" component={AdminContainer}/>
            <Route path="/" component={MainappContainer}/>
        </Switch>
      </Router>
    )
  }
}

export default App;

Admin.js

import React, {Component} from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';


//styles
import './admin-style.scss';

//layout
import ControlPanel from './component/layout/ControlPanel';
import Navbar from './component/layout/Navbar';

//pages
import Quote from './component/pages/quote/Quote';

class Admin extends Component{
    render(){
      return (
        <div className="adminWrapper">
          <ControlPanel />
          <section className="viewPanel">
            <Navbar />
            <Router>
              <Route path="/quote" component={Quote}/>
            </Router>
          </section>
        </div>
      )
    }
  }

  export default Admin;

但是当我点击URL时

http://localhost:3000/admin/quote

它似乎没有加载报价组件

Quote.js

import React, { Component } from 'react';

class Quote extends Component {
    render() {
        return (
            <div className="float-right pr-3">
                <h3>
                    Quote Page
                </h3>
            </div>
        )
    }
}

export default Quote;

3 个答案:

答案 0 :(得分:3)

在处理嵌套子路由时,最简单的解决方案是使用match

  

path-(字符串)用于匹配的路径模式。对于构建嵌套很有用   路线。

     

url-(字符串)URL的匹配部分。对建筑有用   嵌套链接。

根据设计,放置在Route的component渲染方法中的组件会从react-router-dom中获得几个额外的支持。其中有historymatch。您可以利用这些道具来匹配子路线和/或控制浏览器历史记录的位置。

此外,您只需要一个 BrowserRouter实例位于应用程序的顶层,然后您就可以使用Switch呈现任何主对象或子对象路线。并且除非使用state和/或类字段,否则不需要使用类组件。

您的应用程序的一个非常基本的基本示例

Edit React-Router-Dom Nested Routing


src / components / Admin / index.js

import React from "react";
import { Switch, Link, Route } from "react-router-dom";
import ControlPanel from "../ControlPanel";
import Quote from "../Quote";

// since Admin is placed inside a Route's component render
// method, it has access to history and match
function Admin({ history, match }) {
  return (
    <div className="adminWrapper">
      <ControlPanel />
      <section className="viewPanel">
        <Link to={`${match.url}/quote`}>View quote</Link>
        <br />
        <Switch>
          <Route exact path={`${match.path}/quote`} component={Quote} />
        </Switch>
      </section>
      <br />
      <button type="button" onClick={() => history.goBack()}>
        Go Back
      </button>
    </div>
  );
}

export default Admin;

index.js

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Link, Route, Switch } from "react-router-dom";
import Admin from "./components/Admin";

const linkStyle = {
  padding: "0 10px"
};

function App() {
  return (
    <BrowserRouter>
      <Link style={linkStyle} to="/">
        Home
      </Link>
      <Link style={linkStyle} to="/admin">
        Admin
      </Link>
      <Switch>
        <Route path="/admin" component={Admin} />
        <Route path="/" render={() => <h1>Main App</h1>} />
      </Switch>
    </BrowserRouter>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));

答案 1 :(得分:0)

 <Route exact path="/admin" component={AdminContainer}/>     
 <Route exact path="/admin/quote" component={Quote}/>

这不会将您路由到/ admin / quote,而是会将您路由到/ admin / admin / quote。

因为它在管理员内部,所以/ quote就足够了

<Route path="/admin" component={AdminContainer}/>
<Route path="/quote" component={Quote}/>

答案 2 :(得分:0)

遵循Nested Routing Example

您需要做的主要更改是:
1.从<Router></Router>组件中删除Admin,然后
2.将match.path附加到"/quotes",就像在示例中的Topics组件中一样。在此示例中,Topics是一个功能组件,因此它正在接收match作为功能参数。由于您的Admin组件是类组件,因此可以在this.props.match方法中以render的身份访问它。

<Route path={`${this.props.match.path}/quote`} component={Quote}/>