使用 React Router 4 动态加载 Redux 减速器

2024-02-16

我根据组件拆分代码,并且我想仅在组件加载时注入化简器,而不是从一开始就将它们全部堆叠在商店中。

在 React Router 3 中,它非常简单,但我似乎无法让它与 React Router 4 一起工作。

这是减速器和存储:

减速器.js

import { combineReducers } from 'redux'
import { routerReducer } from 'react-router-redux'

import modalReducer from '../modules/modal'

export default combineReducers({
  routing : routerReducer,
  modal   : modalReducer
})

store.js

import { createStore, applyMiddleware, compose } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import thunk from 'redux-thunk'
import createHistory from 'history/createBrowserHistory'
import rootReducer from './reducers'

export const history = createHistory()

const initialState = {}
const enhancers = []
const middleware = [
  thunk,
  routerMiddleware(history)
]

if (process.env.NODE_ENV === 'development') {
  const devToolsExtension = window.devToolsExtension

  if (typeof devToolsExtension === 'function') {
    enhancers.push(devToolsExtension())
  }
}

const composedEnhancers = compose(
  applyMiddleware(...middleware),
  ...enhancers
)

const store = createStore(
  rootReducer(),
  initialState,
  composedEnhancers
)
export default store

我正在对路线使用延迟加载。

如何实现分体式减速器?

我想注入异步减速器,如下所示:

function createReducer(asyncReducers) {
  return combineReducers({
    ...asyncReducers,
    system,
    router,
  })
}

function injectReducer(store, { key, reducer }) {
  if (Reflect.has(store.asyncReducers, key)) return

  store.asyncReducers[key] = reducer
  store.replaceReducer(createReducer(store.asyncReducers))
}

In 反应路由器 v4,对于减速器的异步注入,请执行以下操作:

In your 减速器.js文件添加一个名为 createReducer 的函数,它将注入的Reducers 作为参数并返回组合的减速器:

/**
 * Creates the main reducer with the dynamically injected ones
 */
export default function createReducer(injectedReducers) {
  return combineReducers({
    route: routeReducer,
    modal: modalReducer,
    ...injectedReducers,
  });
} 

然后,在你的store.js file,

import createReducer from './reducers.js';

const store = createStore(
  createReducer(),
  initialState,
  composedEnhancers
);
store.injectedReducers = {}; // Reducer registry

现在,为了在安装反应容器时以异步方式注入减速器,您需要使用注入Reducer.js https://github.com/react-boilerplate/react-boilerplate/blob/master/app/utils/injectReducer.js在容器中运行,然后将所有减速器与连接组合起来。 示例组件Todo.js:

// example component 
import { connect } from 'react-redux';
import { compose } from 'redux';
import injectReducer from 'filepath/injectReducer';
import { addToDo, starToDo } from 'containers/Todo/reducer';

class Todo extends React.Component {
// your component code here
}
const withConnect = connect(mapStateToProps, mapDispatchToProps);

const addToDoReducer = injectReducer({
  key: 'todoList',
  reducer: addToDo,
});

const starToDoReducer = injectReducer({
  key: 'starredToDoList',
  reducer: starToDo,
});

export default compose(
  addToDoReducer,
  starToDoReducer,
  withConnect,
)(Todo);

React-样板 https://github.com/react-boilerplate/react-boilerplate是了解整个设置的绝佳来源。您可以在几秒钟内生成示例应用程序。 InjectReducer.js、configureStore.js(或在您的情况下是store.js)的代码以及实际上整个配置都可以从react-boilerplate中获取。具体链接可以在这里找到注入Reducer.js https://github.com/react-boilerplate/react-boilerplate/blob/master/app/utils/injectReducer.js, 配置Store.js https://github.com/react-boilerplate/react-boilerplate/blob/master/app/configureStore.js.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 React Router 4 动态加载 Redux 减速器 的相关文章

随机推荐

  • nginx、fastcgi 和开放套接字

    我正在尝试在 nginx 上使用 fastcgi 但遇到了一些问题 Nginx 不会重用连接 它在 BeginRequest 标志中给出 0 因此应用程序应该在请求完成后关闭连接 我有以下关闭代码 socket shutdown Socke
  • Composer/PSR - 如何自动加载函数?

    如何自动加载辅助函数 在任何类之外 我可以指定在composer json某种应该首先加载的引导文件 You can 自动加载特定文件 https getcomposer org doc 04 schema md files通过编辑你的co
  • CDI 适用于常规 Java 应用程序吗?

    我有一个简单的 Maven 项目 包含三个类 在我的META INF我有我的空beans xml 每次我运行我的Main java我得到一个NullPointerException Exception in thread main java
  • MinGW:与 LAPACK 和 BLAS 链接会导致 C++ 异常无法处理

    情况很简单 但却很奇怪 当我在没有 LinearAlgebra o 源代码 需要链接到 LAPACK 的情况下编译程序时 会捕获并处理 C 异常 当我不包含该编译单元但仍然链接到库时 llapack lblas 捕获并处理异常 但是一旦我把
  • 如何调试 COM C++ 进程外服务器? (客户端:Excel vba)

    我不知道如何使用 Visual Studio 2015 调试 COM ATL C 进程外 exe 服务器 对于 COM ATL DLL 来说没有问题 当我调用 COM dll 时断点会自动触发 然而 当我尝试调试 EXE 服务器时 调试器并
  • Angular - 如何应用 [ngStyle] 条件

    我有一个 div 我想根据条件设置样式 如果 styleOne 为 true 我想要红色的背景色 如果 StyleTwo 为 true 我希望背景颜色为蓝色 我已经用下面的代码完成了一半的工作 div 是否可以添加一个条件说 如果 styl
  • tomcat中的关闭挂钩(必要)未运行

    我有一个长时间运行的 cpu 和数据库密集型线程 以低优先级运行 可以根据管理员请求由我的 tomcat 应用程序触发 我为此线程使用了关闭钩子 这样如果应用程序被强制停止 它可以在退出之前清理数据库状态 在独立模式下完美工作 使用 con
  • 如何在终端中绘制图表

    我正在研究 ML Theano 最近遇到了这个脚本 https gist github com notmatthancock 68d52af2e8cde7fbff1c9225b2790a7f https gist github com no
  • 从“Docker快速启动终端”启动docker时如何添加`--registry-mirror`?

    来自 docker 分发文档 https github com docker distribution https github com docker distribution 它说要配置 docker 使用镜像 我们应该 Configur
  • Sprite Kit 的关卡编辑器?

    您知道与 iOS 版 Sprite Kit 兼容的关卡编辑器吗 我需要一个类似的软件Cocos 构建器 http cocosbuilder com这很好 但据我所知它与 Sprite Kit 不兼容 谢谢 这是一个清单 截至 2015 年
  • 为什么派生的clone()方法返回一个引用? [复制]

    这个问题在这里已经有答案了 推导Clone包含对泛型类型对象的引用的结构的特征 除非它有Clone边界 在这种情况下 克隆工作将按预期生成clone 方法返回对象的引用 但不返回新对象 我有代码 derive Clone struct A
  • 解析具有多个命名空间的 XML

    所以我想解析这个 XML
  • Pyspark:如何处理 python 用户定义函数中的空值

    我想使用一些非 pyspark 原生的字符串相似性函数 例如数据帧上的 jaro 和 jaro winkler 度量 这些在 python 模块中很容易获得 例如jellyfish 对于没有的情况 我可以写 pyspark udf 很好nu
  • 在 rpm 中将最后一个 git commit id 放在哪里

    我想将最后一个 git commit id 添加到我的 rpm 中 以便有一种万无一失的方法来追踪用于构建包的源 我可以使用 rpmrelease标签 但这已经用于快照的发行号和日期 我不想再让这个负担过重了 是否有其他标签或机制可以将最后
  • Python:无法打开文件“setup.py”:[Errno 2]没有这样的文件或目录。目录更改不会消除错误

    我正在尝试将 pymysql 安装到 Windows 8 机器上 但在安装 python 3 3 时遇到了问题 我让 mython mysql 驱动程序可以在 2 7 上正常工作 但这给了我一些问题 到目前为止 我已被拒绝访问 我用它修复了
  • Droplet 创建后处于活动状态时如何收到通知

    我正在使用 DO API 和 Ansible 开发自动化脚本 我可以创建很多 Droplet 但是如何知道创建的 Droplet 是否处于活动状态 第一种 朴素 方法使用以下过程 A Create droplet with the Digi
  • 书:现代版的 Wrox Spring 书 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用JPA生命周期事件获取实体数据

    我有一个 RESTful API 它使用带有 EntityListners 注释的实体类 在 EntityListner java 中 我有一个用 PostPersist 注释的方法 因此 当该事件触发时 我想提取有关刚刚保存到数据库的实体
  • 浏览器开发者工具:HTML 元素的位置是什么?

    现代 Web 开发工具 例如 Chrome FF IE 提供了一种查看特定元素的 盒模型 和 计算的 CSS 属性 的方法 然而 有没有办法监控final使用这样的工具可以轻松计算 布局位置吗 最好是绝对的 但在父容器内也合适 我可以使用前
  • 使用 React Router 4 动态加载 Redux 减速器

    我根据组件拆分代码 并且我想仅在组件加载时注入化简器 而不是从一开始就将它们全部堆叠在商店中 在 React Router 3 中 它非常简单 但我似乎无法让它与 React Router 4 一起工作 这是减速器和存储 减速器 js im