reactjs - 即使使用 withRouter,反应路由器更改 URL 但不呈现页面
问题描述
我整晚都在研究存在同样问题的所有其他 StackOverflow 问题。我在每个可能使用它的地方都没有使用它。唯一能让路线正常工作的情况是,如果我将导航栏放在 switch 语句的正上方。但是,这对我的应用程序不利,因为我正在为导航链接使用侧抽屉。我的 URL 正在更改,但是没有任何渲染。我正在使用 React 路由器 4.3.1。这是我整个网站的问题,如果我确实按了输入或重新加载,路线就会起作用。这是我的设置。
索引.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { createStore, compose, applyMiddleware, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import thunk from 'redux-thunk';
import './styles/styles.scss'
import reducer from './store/reducers/auth';
import ticketReducer from './store/reducers/ticket'
import filterReducer from './store/reducers/filters'
import { BrowserRouter } from "react-router-dom"
import { HashRouter, Route, Switch, Link, NavLink } from 'react-router-dom';
import 'normalize.css/normalize.css';
import './styles/styles.scss';
import 'react-dates/lib/css/_datepicker.css';
import './styles/daterangepicker.css'
const composeEnhances = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose
const store = createStore(
combineReducers({
users: reducer,
tickets: ticketReducer,
filters: filterReducer
}), applyMiddleware(thunk)
)
const app = (
<Provider store={store}>
<BrowserRouter>
<Route component={App} />
</BrowserRouter>
</Provider>
)
ReactDOM.render(app, document.getElementById('src'));
路由.js
import React from 'react';
import { HashRouter, Route, Switch, Link, NavLink } from 'react-router-dom';
import Home from './usercontainers/home'
import Signup from './usercomponents/Signup'
import NewUserCreated from './usercontainers/NewUserCreated';
import UpdateUser from './usercomponents/UpdateUser';
import createHistory from 'history/createBrowserHistory';
import UserUpdated from './usercontainers/UserUpdated'
import NavBar from './usercontainers/NavBar';
import Header from './usercontainers/Header'
import TicketList from './ticketcomponents/TicketList'
import CreateTicket from './ticketcomponents/CreateTicket'
import TicketDetail from './ticketcomponents/TicketDetail';
import CustomLayout from './usercontainers/Layout'
import LoginForm from './usercomponents/LoginForm';
import UserList from './usercomponents/UserList'
import MyTickets from './ticketcomponents/MyTickets';
import CreateDepartment from './usercomponents/CreateDepartment';
import DepartmentList from './usercomponents/DepartmentList'
import EditDepartment from '../src/usercomponents/UpdateDepartment'
import StartTicket from './ticketcomponents/StartTicket';
import SideNavBar from './containers/SideNavBar';
import { withRouter } from 'react-router-dom'
const history = createHistory();
const BaseRouter = () => (
<div>
<HashRouter history={history}>
<div>
<Header />
<Switch>
<Route exact path='/' component={Home} />
<Route exact path='/signup/' component={Signup} />
<Route exact path='/userlist/' component={UserList} />
<Route exact path='/newuser/' component={NewUserCreated} />
<Route exact path='/userupdated/' component={UserUpdated} />
<Route exact path='/ticketlist' component={TicketList} />
<Route exact path='/createticket' component={withRouter(StartTicket)} />
<Route exact path='/ticketdetailview/:id' component={TicketDetail} />
<Route exact path='/login' component={CreateTicket} />
<Route exact path='/mytickets/' component={MyTickets} />
<Route exact path='/createdepartment/' component={CreateDepartment} />
<Route exact path='/departmentlist/' component={DepartmentList} />
<Route exact path='/updatedepartment/:id' component={EditDepartment} />
<Route exact path='/updateuser/:id' render={(props) => (<UpdateUser />)} />
</Switch>
</div>
</HashRouter>
</div>
);
export default BaseRouter;
应用程序.js
import React, { Component } from 'react';
import { BrowserRouter as Router } from 'react-router-dom';
import { connect } from 'react-redux';
import BaseRouter from './routes';
import * as actions from './store/actions/auth';
import Start from './usercontainers/Start'
import { BrowserRouter } from "react-router-dom"
import CustomLayout from './usercontainers/Layout';
import { withRouter } from 'react-router-dom'
import { HashRouter, Route, Switch, Link, NavLink } from 'react-router-dom';
class App extends Component {
componentDidMount() {
this.props.onTryAutoSignup();
console.log(this.props)
}
render() {
return (
<Start {...this.props}>
<BaseRouter />
</Start>
);
}
}
const mapStateToProps = state => {
return {
isAuthenticated: state.token !== null,
username: state.username,
user: state.user,
filters: state.filters
}
}
const mapDispatchToProps = dispatch => {
return {
onTryAutoSignup: () => dispatch(actions.authCheckState()),
getfetchUser: id => dispatch(actions.fetchUser(id))
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
解决方案
如果我不得不猜测发生了什么,我会说您的问题归结为Routers
在单个组件树中有两个。您不需要同时使用BrowserRouter
and HashRouter
- 如果没有第二个嵌套的HashRouter
. 您应该只有一个顶级路由器,然后您可以嵌套路由,以便在路径发生变化时将某些位的复杂性换出。
withRouter
主要用于如果您在一个组件中的 a 没有立即由 a 渲染,<Route />
并且您需要访问路由器 propsmatch
和history
.
您可以尝试删除<HashRouter/>
并查看是否可以阻止怪异吗?
推荐阅读
- reactjs - Material-UI React-Select 自动完成预选项目错误
- java - java.lang.NoSuchMethodError: io.searchbox.action.Action.getURI()Ljava/lang/String
- javascript - 更新或插入数据后关闭弹出窗口
- benchmarkdotnet - 为什么在尝试打开 ConcurrencyVisualizerProfiler 数据时收到“收集无法继续,因为内核事件丢失”消息?
- c - clang:有没有办法指定 c11 原子操作中使用的低级指令?
- html - html css 可滚动表格不会与上面的表格对齐
- php - 在 PHP 中写入函数的返回值
- hibernate - 外键上的简单多对一关系错误不可为空
- amazon-web-services - 在创建 Kubernetes pod 时在 EC2 实例上获取 ImagePullBackOff
- jetbrains-ide - 是否可以在 GoLand IDE VCS History 中找到某些行?