当前位置: 首页 > 知识库问答 >
问题:

如何使用redux和react路由器组织状态?

锺离晗昱
2023-03-14

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

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

共有2个答案

艾照
2023-03-14

Redux路由器不再与react路由器v4兼容,上述解决方案将无法工作。

因此,我建议使用redux小路由器。与redux路由器不同,它不依赖react路由器,而是它的替代品。

有了它,你可以做这样的事情:

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

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

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

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

另外,您可以参考或使用这个react样板文件,其中已经实现了redux LIGHT redux

厍兴腾
2023-03-14

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

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

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')
);
js prettyprint-override">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;
}
import React from 'react';
import { Route } from 'react-router';
import  App from './app';

module.exports = (
    <Route component={App}>
        ...all your routes go here
    </Route>
);
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>
        );
    }
}

因此,正如您所看到的,有一个更高阶的组件封装了其余的路由

 类似资料:
  • 在我的情况下,当使用从react-redux时,反应路由器不会将我的反应组件视为有效组件。并且有一个警告:失败proType:无效prop提供给 Main.js

  • 我有一个简单的(目前)应用程序,使用react router和redux,我想为它添加国际化功能。 我已经安装了npm包,并且能够安装和运行提供的示例。我已经将适当的导入添加到我自己的应用程序中,并将国际化标签添加到根渲染方法中。 当我将I18nextProvider标记添加到render方法时,我得到了错误 找不到模块“react” 这并不是特别有用,尤其是因为如果我删除标签,react应用程序

  • 使用redux和反应路由器,我想访问路由指定的组件以外的组件上的路由参数。 我已经对react-router、redux和react-router-redux进行了如下设置,我想从我的redux存储访问reportId参数。 我已经尝试连接react-redux路由器来存储路由状态,但是我发现除了活动路由的完整路径之外,redux内部没有任何有用的存储。这让我可以选择从redux中的路径解析出re

  • 我正在使用React和React路由器尝试将我的组件链接到一个项目中。我想从主页(当前组件)链接一张图片到另一个组件。 目前我可以点击图片,它有点像一个链接(有时点击后变成蓝色),尽管它没有链接到其他组件,没有错误显示,网址栏中没有任何变化。什么都没发生。 有什么想法吗?这是我的代码: 代码错误:react dom。发展js:17117上述错误发生在组件中:img(由Home创建)中div(由Ho

  • 我使用反应路由器作为根和"/"下的所有请求都指向反应路由器。并且当响应路由器发现url与任何定义的组件不匹配时,它将呈现NoMatch组件。问题来了,NoMatch被渲染了,这就是我想要的,但是状态代码仍然是200而不是404。当我的css或js文件被放置在一个错误的url反应路由器做同样的事情,它的反应200!然后页面告诉我,我的资源内容类型有一些问题! 那么,我如何使用react router

  • 我正在使用React-Redux,在阅读了React-router-Redux和Redux-router之后,在阅读了Dan Abramov的答案之后,我决定使用“香草”React-router(此时我不关心时间旅行等)。 剩下的唯一悬而未决的问题是如何跨不同的路径处理状态。在我的应用程序中,每个路由子树都可以是不同的独立部分(尤其是当它变大时)。使用一个存储来处理所有路由/页面仍然是一种好的做法