以编程方式路由与 redux 反应

Posted

技术标签:

【中文标题】以编程方式路由与 redux 反应【英文标题】:Routing programmatically in react with redux 【发布时间】:2018-12-28 16:49:42 【问题描述】:

当我想从页面上的静态链接进行路由时,index.js 中的以下代码 sn-p 对我来说效果很好-

import React from 'react';
import ReactDOM from 'react-dom';
import LoginForm from './components/LoginForm/LoginForm';
import  Provider  from 'react-redux';
import store from './redux/store';
import  BrowserRouter as Router, Switch, Route, Link  from 'react-router-dom';
import Home from './components/Home.js'

ReactDOM.render(
  <Provider store=store>
    <Router>
      <div>
        <h2>My Page</h2>
        <ul>
          <li><Link to='/'>LoginForm</Link></li>
          <li><Link to='/home'>Home</Link></li>
        </ul>
        <hr />

        <Switch>
          <Route exact path='/' component=LoginForm />
          <Route exact path='/home' component=Home />
        </Switch>
      </div>
    </Router>
  </Provider>,
  document.getElementById('root')

是否可以在代码中路由到另一个页面,例如?

 updateStore(loggedIn)
    const action = type:loggedIn;
    store.dispatch(action);
    if(loggedIn==='LOGGED_IN')
       console.log("I am In");
      //route me into another page ??
    else
      console.log("I am out");
    
  

【问题讨论】:

Linking programmatically 是什么意思? 类似于 LoginForm 中的链接。我想在登录成功后在我的回调方法中路由。 您想在登录后重定向到/ 我想在登录后重定向到 /home 【参考方案1】:

得到我的答案here

创建了我自己的 route.js

import React from 'react';
import  Route, Switch  from 'react-router';
import LoginForm from './components/LoginForm/LoginForm';
import Home from './components/Home';

class RouteList extends React.Component 
    render() 
        return (
            <Switch>
                <Route exact path="/" component=LoginForm />
                <Route path='/home' exact=true component=Home></Route>
            </Switch>

        );
    


export default RouteList;

然后在 index.js -

import React from 'react';
import ReactDOM from 'react-dom';
import  Provider  from 'react-redux';
import store from './redux/store';
import RouteList from './route';
import  Router  from 'react-router'
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()

ReactDOM.render(
  <Provider store=store>
    <Router history=history>
      <RouteList></RouteList>
    </Router>
  </Provider>,
  document.getElementById('root')
);

最后在我的 action.js 中 -

import  history  from '../index';

callLoginApi(email, password, error => 
  dispatch(setLoginPending(false));
  if (!error) 
    dispatch(setLoginSuccess(true));
    history.push('/home');
   else 
    dispatch(setLoginError(error));
  
);

【讨论】:

【参考方案2】:

您可以为此使用react-router

npm i react-router --save

在您的组件中执行以下操作

import browserHistory from 'react-router';

 callback = () => 
   browserHistory.push('/home');
 

【讨论】:

这不起作用:( ..我在 index.js 中使用“import BrowserRouter as Router, Switch, Route, Link from 'react-router-dom';”。可能是反应-router-dom 与 react-router 不同 看看这个关于你的问题的答案***.com/questions/42684809/…

以上是关于以编程方式路由与 redux 反应的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式反应路由器 v4 导航

以编程方式重定向到反应路由器 v6 中的路由的问题

以编程方式重定向到反应路由器 v6 中的路由的问题

反应路由器,以编程方式导航时传递数据?

以编程方式反应导航更改选项卡顺序

反应如何在 redux-saga 中导航路由器?