我正在使用管理仪表板构建面向消费者的应用程序。我想为他们分开路由,所以尝试委托:-
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;
答案 0 :(得分:3)
在处理嵌套子路由时,最简单的解决方案是使用match。
path-(字符串)用于匹配的路径模式。对于构建嵌套很有用 路线。
url-(字符串)URL的匹配部分。对建筑有用 嵌套链接。
根据设计,放置在Route的component
渲染方法中的组件会从react-router-dom中获得几个额外的支持。其中有history和match
。您可以利用这些道具来匹配子路线和/或控制浏览器历史记录的位置。
此外,您只需要一个 BrowserRouter
实例位于应用程序的顶层,然后您就可以使用Switch
呈现任何主对象或子对象路线。并且除非使用state
和/或类字段,否则不需要使用类组件。
您的应用程序的一个非常基本的基本示例:
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)
您需要做的主要更改是:
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}/>