我在我的网站上有一个BrowserRouter服务/,/ login和/ logout。 登录后,您可以访问每个页面上具有相同导航栏和包含数据/功能的动态内容的应用程序。 模板组件“ Main”具有一个HashRouter,可为应用程序的不同页面提供服务。
我在导航栏“ CMNav”中添加了搜索表单,但是当用户验证表单时,我一直使用历史记录进行重定向。
由于有了withRouter,CMNav可以访问BrowserRouter的历史记录,但是无法看到HashRouter的历史记录,因为他是在同一级别定义的。
因此,当我键入搜索并按Enter键时,我的URL更改为/ search,但未完成对搜索组件的重定向(因为我正在使用错误的历史记录对象)。
有关如何解决此问题的帮助吗?
我的入口是index.js。
index.js
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Redirect, Route, Switch } from "react-router-dom";
import Main from "./Main";
import Login from "./auth/login";
const Router = require("react-router");
const auth = require("./auth/auth");
ReactDOM.render(
<div>
<BrowserRouter history={Router.browserHistory}>
<Switch>
<Route
path="/login"
render={() => (auth.loggedIn() ? <Redirect to="/" /> : <Login />)}
/>
<Route
path="/logout"
render={() => {
auth.logout();
return <Redirect to="/login" />;
}}
/>
<Route
path="/"
render={() => (auth.loggedIn() ? <Main /> : <Redirect to="/login" />)}
/>
</Switch>
</BrowserRouter>
</div>,
document.getElementById("root")
);
登录用户后,他将重定向到“ /”,并调用“主要”组件。
Main.jsx
import React, { Component } from "react";
import { HashRouter, Route } from "react-router-dom";
import Home from "./pages/Home";
import Search from "./pages/Search";
import CMNav from "./components/cm-nav";
class Main extends Component {
constructor(props) {
super(props);
this.state = {};
this.componentDidMount = this.componentDidMount.bind(this);
}
componentDidMount() {
// Do things
}
render() {
return (
<div>
<div className="container-fluid">
<CMNav />
<HashRouter>
<div>
<Route exact path="/" component={Home} />
<Route path="/search" component={Search} />
</div>
</HashRouter>
</div>
</div>
);
}
}
export default Main;
cm-nav.jsx
import React, { Component } from "react";
import { withRouter } from 'react-router-dom';
import { MenuItem, Nav, Navbar, NavDropdown, NavItem } from "react-bootstrap";
import TextInput from "./text-input";
class CMNav extends Component {
constructor(props) {
super(props);
this.navSearchCallback = this.navSearchCallback.bind(this);
}
navSearchCallback(searchedText) {
// Meant to be a prop
this.props.history.push({
pathname: "/#/search",
state: { searchedText: searchedText }
});
}
render() {
return (
<Navbar collapseOnSelect fluid>
<Navbar.Header>
<Navbar.Brand>
<a href="#">
<img
className={"img-thumbnail img_logo_small"}
src={"images/logo.png"}
data-holder-rendered="true"
/>
</a>
</Navbar.Brand>
<Navbar.Toggle />
</Navbar.Header>
<Navbar.Collapse>
<Nav>
<NavItem eventKey={1} href="#search"> Recherche </NavItem>
</Nav>
<Nav pullRight>
<NavItem eventKey={1}> <TextInput callback={(param) => {this.navSearchCallback(param)}}/> </NavItem>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
export default withRouter(CMNav);
答案 0 :(得分:0)
我建议您执行以下操作:
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
<BrowserRouter **history={Router.browserHistory}**>
答案 1 :(得分:0)
没关系,答案就像将CMNav放在HashRouter中一样简单。
<HashRouter>
<div>
<CMNav />
<Route exact path="/" component={Home} />
<Route path="/search" component={Search} />
</div>
</HashRouter>