14

Redux 提倡使用单一状态的单一存储。但是,使用 react-router 您可以获得多个页面,每个页面都有自己的顶级根组件。

应该如何使用具有多个页面的 react-router 应用程序来连接 redux?React-router 1.0 不再允许您将 props 传递给路由,因此使路由器成为包含所有页面状态的顶级组件不再可能,也不可行。

4

2 回答 2

9

如果您使用的是 redux + react-router,我强烈建议您也使用 redux-router - 这将允许您将路由信息保存在您的商店中 - 我通常有以下设置。

redux-router: ^1.0.0-beta3 / react-router": ^1.0.0-rc1 / redux: "^3.0.2 / react: "^0.14.0

//index.js [入口点]

import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route } from 'react-router';
import { Provider } from 'react-redux';
import createStore from './utils/create-store';
import routes from './bootstrap/routes';
import { ReduxRouter } from 'redux-router';

const store = createStore(routes);

ReactDOM.render(
    <Provider store={store}>
        <ReduxRouter>
            {routes}
        </ReduxRouter>
    </Provider>,
    document.getElementById('root')
);

// 创建-store.js

import { applyMiddleware, createStore, combineReducers, compose } from 'redux';
import * as reducers from '../reducers/index';
import promiseMiddleware from './promise-middleware';
import { routerStateReducer, reduxReactRouter } from 'redux-router';
import history from './history'

/**
 * Sets up the redux store.  Responsible for loading up the reducers and middleware.
 *
 * @param routes
 */
export default function create(routes) {
    const composedReducers = combineReducers({
        router: routerStateReducer,
        ...reducers
    });
    const finalCreateStore = compose(applyMiddleware(promiseMiddleware),
        reduxReactRouter({
            routes,
            history
        }))(createStore);
    let store = finalCreateStore(composedReducers);
    return store;
}

// 路由.js

import React from 'react';
import { Route } from 'react-router';
import  App from './app';

module.exports = (
    <Route component={App}>
        ...all your routes go here
    </Route>
);

// 应用程序.js

import React, { PropTypes } from 'react';
import { connect } from 'react-redux';

export default class App extends React.Component {

    render() {
        const { props: { children } } = this;
        return (
            <div className="app-container">
              {children}
            </div>
        );
    }
}

如您所见,有一个更高阶的组件包裹了您的其余路线

于 2015-10-19T07:50:07.717 回答
3

redux-router 不再兼容 react-router v4,上面的解决方案也不行。

因此,我建议使用redux-little-router。与 redux-router 不同,它不依赖于 react-router,而是替代它。

有了它,您可以执行以下操作:

从您的异步操作推送到新路由:

export function navigateAbout() {
  return (dispatch) => {
    dispatch(push('/about'))
  }
}

在 redux-dev-tools 中查看您的路由器详细信息(当前路径、查询字符串和参数),并像访问任何其他道具一样从您的存储中访问这些详细信息:

function mapStateToProps(state) {
  return {
    string: state.router.query.string
  }
}

PS。你可以参考或使用这个带有 redux-little-redux 的react 样板已经实现

于 2017-06-07T04:33:17.237 回答