reactjs - 如何在不重新加载整个页面的情况下进行路由?

标签 reactjs react-router

我正在使用react-route,但我在路由方面遇到了一些问题。

整个页面正在重新加载,导致每次都加载我已经获取并存储在reducer中的所有数据。

这是我的路线文件:

var CustomRoute = React.createClass({
    render:function(){
        return <Router history={browserHistory}>
            <Route path="/" component={Layout}>
                <IndexRedirect to="/landing" />
                <Route path="landing" component={Landing} />
                <Route path="login" component={Login} />
                <Route path="form" component={Form} />
                <Route path="*" component={NoMatch} />
            </Route>
        </Router>
    },
});

在路由之前,我已经通过在 main.jsx 中调用操作来存储数据

/** @jsx React.DOM */
'use strict'
var ReactDOM = require('react-dom')
var React = require('react')
var Index = require('./components/index')
var createStore = require("redux").createStore
var applyMiddleware = require("redux").applyMiddleware
var Provider = require("react-redux").Provider
var thunkMiddleware = require("redux-thunk").default
var reducer = require("./reducers")
var injectTapEventPlugin =require('react-tap-event-plugin');
injectTapEventPlugin()
var createStoreWithMiddleware=applyMiddleware(thunkMiddleware)(createStore);
var store=createStoreWithMiddleware(reducer);
store.dispatch(actions.load_contacts()) //////////// <<<<<< this is what i call to store data already

ReactDOM.render( <Provider store={store}><Index/></Provider> , document.getElementById('content'))

问题是如果登录成功,我必须路由到另一个页面:

this.props.dispatch(actions.login(this.state.login,this.state.password,(err)=>{
    this.setState({err:err})
    if (!err){
        window.location = "/form"
    }
}));  

window.location 可以解决问题,但它会重新加载所有内容,效率非常低。 在手动 route 我使用<Link\>该路由无需重新加载,但是对于自动化,我不知道如何做到这一点。

任何建议将不胜感激。

最佳答案

对于最新版本 (v2.0.0-rc5),推荐的导航方法是直接推送到历史记录单例。

DEMO

相关代码

import { browserHistory } from './react-router'
browserHistory.push('/some/path')

如果使用较新的react-router API,您需要在组件内部使用this.props中的history,因此:

static propTypes = {
    history: React.PropTypes.object
}

this.props.history.push('/some/path');

如果使用react-router-redux,它提供了push功能,您可以像这样调度:

import { push } from 'react-router-redux';
this.props.dispatch(push('/some/path'));

v2.4.0及更高版本中,使用更高阶的组件将路由器作为组件的支柱。

import { withRouter } from 'react-router'

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

// Export the decorated class
var DecoratedExample = withRouter(Example);

// PropTypes

Example.propTypes = {
  router: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  }).isRequired
};

访问此链接了解更多信息:http://kechengpuzi.com/q/s31079081

关于reactjs - 如何在不重新加载整个页面的情况下进行路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39910041/

相关文章:

javascript - react 将对象添加到对象

javascript - Next.js,重定向到getServerSideProps里面的404页面

javascript - 如果字符串仅包含空格,则匹配的正则表达式?

spring - 我可以通过 grails 的 spring 安全凭证来使用react吗?

javascript - 通过 React Route 传递的 Props 无法被子组件访问

javascript - 单击预览按钮后,如何在我的 React App 上显示第二个和第三个按钮?

javascript - 我可以向 React 中的元素添加可选属性吗?

javascript - 为什么我的导航栏没有在 React 中呈现?

javascript - React 和 React Router,使用不同的 prop 渲染相同的元素两次会导致两个元素具有相同的 prop?

javascript - React Routing 在本地机器上工作,但在 Heroku 上不工作