2017-05-25 44 views
1

通常(反应路由器+终极版):<Provider /> outside或<Router /> outside>?

<Provider store={store}> 
<Router> 
    <App /> 
</Router> 
</Provider> 

为什么不反过来?

<Router> 
    <Provider store={store}> 
    <App /> 
    </Provider> 
</Router> 

后续问题:安装认证,当LOGIN_SUCCESS动作被触发,我们需要保存返回的标记为window.localStorage重定向的页面。所以我写成功处理程序终极版中间件里面:

const localStorageMiddleware = store => next => action => { 
    if (action.type === 'LOGIN_SUCCESS') { 
    if (!action.payload.error) { 
     window.localStorage.setItem('jwt', action.payload.token) 
    } 
    } else if (action.type === 'LOGOUT_SUCCESS') { 
    window.localStorage.setItem('jwt', '') 
    } 
    next(action) 
} 

然后,我觉得有必要访问history.push做重定向(这就是为什么我问的第一个问题,试图进去redux代码访问location),我该怎么办这样做?

+0

您使用的是什么版本的react-router? – ickyrr

回答

0

试试这个:

<Provider store={store}> 
<Router> 
    <App /> 
</Router> 
</Provider> 

重定向:

// top-most line of the reducer 
import { browserHistory } from 'react-router'; 

const localStorageMiddleware = store => next => action => { 
    if (action.type === 'LOGIN_SUCCESS') { 
    if (!action.payload.error) { 
     window.localStorage.setItem('jwt', action.payload.token); 
     browserHistory.push('/'); 
    } 
    } else if (action.type === 'LOGOUT_SUCCESS') { 
    window.localStorage.setItem('jwt', '') 
    } 
    next(action) 
} 

我取逻辑到actions文件,而不是reducers

+0

很酷。顺便说一下,围绕路由器的包装提供程序,而不是其他方式? –

+0

我使用承诺中间件来处理动作,所以我不能做.then()的东西在行动,对不对? –

+0

我还没有尝试过。你有吗? – ickyrr

相关问题