使用 react-router,redux 将无法工作

Posted

技术标签:

【中文标题】使用 react-router,redux 将无法工作【英文标题】:With react-router, redux will not work 【发布时间】:2016-03-18 20:37:46 【问题描述】:

我看了很多类似的问题,没有一个适合我。

关于

this.props.children doesn't always inherit the context from its parent

Could not find "store" in either the context or props

//store config
const createHistoryWithBasename = (historyOptions) => 
    return useBasename(createHistory)(
        basename: '/user_home'
    )

const finalCreateStore = compose(
    applyMiddleware(thunk, createLogger()),
    reduxReactRouter(
        createHistory: createHistoryWithBasename ),
        devTools()
    )(createStore);

export function configureStore(initialState) 
    const store = finalCreateStore(rootReducer, initialState);
    return store;

索引文件,所有路由嵌套在Provider中。

//entry file
let routes = (
    <Route path="/" component=UserHome></Route>
);

ReactDom.render(
    <Provider store=store >
        <ReduxRouter>
            routes
        </ReduxRouter>
    </Provider>,
    rootElement
);

组件。我记录了 this.props,没有 dispatch 属性。而context的参数是一个空对象。

//user_home.js
class UserHome extends React.Component 
    constructor(props, context)
        //context is empty Object
        super(props, context);
    
    render() 
        //this.props.dispatch is undefined
        return (
            <div className="container">
               test
            </div>
        );
    



function mapStateToProps(state)
    return state;

export default connect(mapStateToProps, 
    pushState
)(UserHome);

也许,这是一个简单的问题,但花了我很多时间。希望得到您的帮助。谢谢!

【问题讨论】:

【参考方案1】:

也许我们可以将动作创建者注入到connect

import * as ActionCreators from './actions/user_actions';

//we can use the actions in ActionCreators to dispatch the action.

export default connect(mapStateToProps, 
    pushState: pushState,
    ...ActionCreators
)(Component);

动作

//action file
export function xxAction()
    return dispatch =>
        dispatch(
            type: 'XX_ACTION'
        );
    

这个解决方案适合在子组件中调度动作。有一些限制,期待更好的解决方案。

【讨论】:

你好在哪里。基本上,对于您的方法,您需要使用 redux-thunk 将调度传递给动作创建者,这对于简单的情况来说似乎有点矫枉过正。你有 mapDispatchToProps 函数作为第二个 connect 参数,它旨在将动作创建者绑定到 dispatch 并将它们进一步传递给连接组件的道具。谈到context,除非您在子组件上指定contextTypes 字段,否则您的组件将无法访问它。

以上是关于使用 react-router,redux 将无法工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Redux-Router + React-Router 将基本 URL 添加到应用程序

react-router搭配react-redux无法监听路由变化的问题

如何使用 React-Router 和 React-Redux 将道具发送到子路由组件?

如何用 redux 和 react-router 组织状态?

使用react,react-router和redux进行分页

React、Redux、React-Router - 卡在安装 material-ui