2017-05-14 128 views
0

後我就是一個反應,終極版初學者。我創建了一個應用程序的反應沒有終極版和集成陣營路由器V4。一切都很完美。陣營路由器V4不加載組件集成終極版

然後我整合終極版到應用程序,所以我可以共享狀態。之後,我的路由器停止工作。所以我想解決這個問題,我應該綜合反應路由器,終極版V5(其實我瞭解到,您不必添加反應路由器,終極版,使路由器的工作。它的存在更新關於路由器信息Redux的狀態)。仍然路由器不工作。

當我點擊後應載入路由器,瀏覽器URL更改爲正確的路由器URL和終極版路由器狀態改變來糾正路由器的鏈路(此反應使用開發工具觀察)。如果我刷新頁面,與路由器相關的組件將加載。我配置的終極版店

/** 
* Created by Shane on 5/12/2017. 
*/ 
import { createStore,combineReducers,applyMiddleware,compose } from 'redux' 
import {authenticationReducer} from './../reducers/index' 
import { reducer as formReducer } from 'redux-form' 
import thunk from 'redux-thunk' 
import { routerReducer, routerMiddleware } from 'react-router-redux' 
import createHistory from 'history/createBrowserHistory' 


// Create a history of your choosing (we're using a browser history in this case) 
const history = createHistory(); 

let configureStore =() => { 

    const persistedState = localStorage.getItem('reduxState') ? JSON.parse(localStorage.getItem('reduxState')) : {}; 

    let reducer=combineReducers({ 
     authenticationData:authenticationReducer, 
     router:routerReducer, 
     form: formReducer  // <---- Mounted at 'form' 
    }); 


//creating the store using reducer 
    let store=createStore(reducer, 
     persistedState, 
     compose(applyMiddleware(thunk,routerMiddleware(history)), 
     window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__())); 

    store.subscribe(() => { 
     // console.log("Current State",store.getState()); 
     localStorage.setItem('reduxState', JSON.stringify(store.getState())) 
    }); 



    return store; 
}; 

module.exports ={ 
    history, 
    configureStore 
}; 

文件這是我的主要文件,其中我定義的路由

import React from 'react'; 
import { Grid } from 'react-bootstrap'; 
import { Row } from 'react-bootstrap'; 
import { Col } from 'react-bootstrap'; 
import {connect} from 'react-redux' 
import Content from '../Content'; 
import AppNavBar from '../nav_bar/app_nav_bar/AppNavBar'; 
import './Base.css'; 
import Login from "../login/Login"; 
import Profile from "../profile/Profile"; 
import MyApps from "../my_apps/MyApps"; 
import NewAppBase from "../new_app/new_app_base/NewAppBase"; 
import {Route} from "react-router"; 


class Base extends React.Component { 


    constructor(props) { 
     super(props); 
     // this.state = { isLogged: true } ; 
    } 


    render() { 

     //let {dispatch} =this.props; 
     let content=(<div></div>); 

    // dispatch(action.apiLogIn("y2kshane","Abcd1234")); 
     if(this.props.isLogged) 
     { 
      content=(
       <Grid className="Parent-container"> 
        <Row> 
         <Col xs={12} md={12}> <AppNavBar/></Col> 
        </Row> 

        <Row > 
         <Col xs={12} md={12} className="content"> 
          {/*<Content/>*/} 

          <Route exact path='/profile' component={Profile}/> 
          <Route exact path='/my-apps' component={MyApps}/> 
          <Route exact path='/new-app' component={NewAppBase}/> 


         </Col> 

        </Row> 


       </Grid> 
      ); 
     }else { 
      content=(<Login/>); 
     } 



    return (
     <span>{content}</span> 
    ); 


    } 

} 

export default connect((state) => { 
    return { 
     isLogged:state.authenticationData.isLogged 
    } 
})(Base); 

AppNavBar文件,其中我所說的路線

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import { BrowserRouter } from 'react-router-dom' 
import {Provider} from 'react-redux' 
import Base from './base/Base'; 
import 'mdi/css/materialdesignicons.css' 
import './index.css'; 
import * as storeConfig from './redux/store/store' 
import { ConnectedRouter } from 'react-router-redux' 
import createHistory from 'history/createBrowserHistory' 


let store=storeConfig.configureStore(); 
const history = storeConfig.history; 

ReactDOM.render(

    <Provider store={store}> 
     <ConnectedRouter history={history}> 
       <Base /> 
     </ConnectedRouter> 
    </Provider>, 
    document.getElementById('root') 
); 

基礎文件

/** 
* Created by admin on 4/27/2017. 
*/ 
import React, { Component } from 'react'; 
import { Navbar } from 'react-bootstrap'; 
import { Nav } from 'react-bootstrap'; 
import { NavItem,NavDropdown,MenuItem } from 'react-bootstrap'; 
import './AppNavBar.css'; 
import {connect} from "react-redux"; 
import * as action from './../../redux/actions/index' 
import {push} from "react-router-redux"; 


class AppNavBar extends Component { 

    constructor(props) { 
     super(props); 
     // this.state = { isLogged: true } ; 
     // this.navigateTo.bind(this); 
    } 

    logout =() => { 

     console.log("calling logot"); 
     this.props.dispatch(action.logoutAction()) 
    }; 

    navigateTo = (url) => 
    { 
     this.props.dispatch(push(url)) 
    }; 


    render() { 
     return (
      <Navbar className="nav-bar" collapseOnSelect> 
       <Navbar.Header > 
        <Navbar.Brand className="nav-bar-text"> 
         <a href="#">Dev Dashboard</a> 
        </Navbar.Brand> 
        <Navbar.Toggle /> 
       </Navbar.Header> 
       <Navbar.Collapse> 
        <Nav> 
         {/*<LinkContainer to="/profile">*/} 
          <NavItem eventKey={1} onClick={() => this.navigateTo("/profile")}>Profile</NavItem> 
         {/*</LinkContainer>*/} 
         {/*<LinkContainer to="/my-apps">*/} 
          <NavItem eventKey={2} onClick={() => this.navigateTo("/my-apps")}>My Apps</NavItem> 
         {/*</LinkContainer>*/} 
         <NavItem eventKey={2} href="#" className="nav-bar-text">Reports</NavItem> 
         <NavItem eventKey={2} href="#" className="nav-bar-text">API Browser</NavItem> 
         <NavItem eventKey={2} href="#" className="nav-bar-text">Knowledge Base</NavItem> 
        </Nav> 
        <Nav pullRight> 
         <NavDropdown eventKey={3} title={this.props.username} id="basic-nav-dropdown"> 
          {/*<NavBarUser/>*/} 
          <MenuItem eventKey={3.1}>Settings</MenuItem> 
          {/*<MenuItem eventKey={3.2}>Another action</MenuItem>*/} 
          {/*<MenuItem eventKey={3.3}>Something else here</MenuItem>*/} 
          <MenuItem divider /> 
          <MenuItem eventKey={3.3} onClick={this.logout} ><b>Logout</b></MenuItem> 
         </NavDropdown> 


        </Nav> 
       </Navbar.Collapse> 
      </Navbar> 

     ); 
    } 
} 


export default connect(
    (state) => { 
     return { 
      username : state.authenticationData.userName 
     } 
    } 
)(AppNavBar); 

我一直在努力,現在解決這個問題像2天:(。請幫幫我。謝謝。

回答

1

所以事實證明,你必須包裝你的路由組件,使用與路由。我認爲這是與redux connect有關的一些問題。

export default withRouter(connect((state) => { 
    return { 
     isLogged:state.authenticationData.isLogged 
    } 
})(Base)); 

完整代碼

import React from 'react'; 
import { Grid } from 'react-bootstrap'; 
import { Row } from 'react-bootstrap'; 
import { Col } from 'react-bootstrap'; 
import {connect} from 'react-redux' 
import Content from '../Content'; 
import AppNavBar from '../nav_bar/app_nav_bar/AppNavBar'; 
import './Base.css'; 
import Login from "../login/Login"; 
import Profile from "../profile/Profile"; 
import MyApps from "../my_apps/MyApps"; 
import NewAppBase from "../new_app/new_app_base/NewAppBase"; 
import {Route, withRouter} from "react-router-dom"; 


class Base extends React.Component { 


    constructor(props) { 
     super(props); 
     // this.state = { isLogged: true } ; 
    } 


    render() { 

     //let {dispatch} =this.props; 
     let content=(<div></div>); 

    // dispatch(action.apiLogIn("y2kshane","Abcd1234")); 
     if(this.props.isLogged) 
     { 
      content=(
       <Grid className="Parent-container"> 
        <Row> 
         <Col xs={12} md={12}> <AppNavBar/></Col> 
        </Row> 

        <Row > 
         <Col xs={12} md={12} className="content"> 
          {/*<Content/>*/} 

          <Route exact path='/profile' component={Profile}/> 
          <Route exact path='/my-apps' component={MyApps}/> 
          <Route exact path='/new-app' component={NewAppBase}/> 


         </Col> 

        </Row> 


       </Grid> 
      ); 
     }else { 
      content=(<Login/>); 
     } 



    return (
     <span>{content}</span> 
    ); 


    } 

} 

export default withRouter(connect((state) => { 
    return { 
     isLogged:state.authenticationData.isLogged 
    } 
})(Base));