即使使用withRouter,React路由器也会更改URL但不会呈现页面

问题描述 投票:0回答:1

我花了一整夜的时间来讨论所有其他有同样问题的StackOverflow问题。我没有在每个地方使用过,我可以使用它。我能够让路由工作的唯一一次是将导航栏放在switch语句的正上方。但是,这对我的应用程序不利,因为我使用侧面抽屉导航链接。我的网址正在改变,但是没有任何渲染。我正在使用React路由器4.3.1。这是我的整个网站的一个问题,如果我点击输入或重新加载,路线工作。这是我的设置。

Index.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'));

Routes.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;

App.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);
reactjs react-router
1个回答
1
投票

如果我不得不猜测发生了什么,我会说你的问题归结为在一个组件树中有两个Routers。你不应该同时使用BrowserRouterHashRouter - 没有第二个嵌套的HashRouter,你的设置会很好。您应该只有一个顶级路由器,然后您可以嵌套路由,以便在路径更改时将某些位的复杂性交换出来。

withRouter主要用于如果你是一个没有立即由<Route />and呈现的组件,你需要访问路由器道具,如matchhistory

你可以尝试删除<HashRouter/>,看看是否能阻止怪异吗?

© www.soinside.com 2019 - 2024. All rights reserved.