ReplaceReducer 导致意外的键错误

2024-01-30

我有一个 React 应用程序,它动态加载模块,包括模块的减速器函数,然后调用 Redux 的replaceReducer 来替换减速器。不幸的是我收到了一个错误

在传递给 createStore 的初始状态参数中发现意外的键“bookEntry”。期望找到已知的减速器键之一:“bookList”、“root”。意外的键将被忽略。

书名在哪里was正在更换的旧减速机上的钥匙。从 bookEntry 模块开始并切换到 bookList 会导致此逆错误

在传递给 createStore 的初始状态参数中发现意外的键“bookList”。期望找到已知的减速器键之一:“bookEntry”、“root”。意外的键将被忽略。

代码如下 - 取消注释注释的代码实际上可以解决此问题,但我猜应该不需要它。

我是否对 Redux 做了其他错误,使得这段代码变得必要?

function getNewReducer(reducerObj){
    if (!reducerObj) return Redux.combineReducers({ root: rootReducer });

    //store.replaceReducer(function(){
    //    return {
    //        root: rootReducer()
    //    }
    //});

    store.replaceReducer(Redux.combineReducers({
        [reducerObj.name]: reducerObj.reducer,
        root: rootReducer
    }));
}

一般来说we don’t建议您在更改路线或加载新模块时“清理”数据。这使得应用程序变得不太可预测。如果我们谈论的是数十万记录,那么当然。这是您计划加载的数据量吗?

如果每个页面上只有几千个项目,则卸载它们没有任何好处,并且会因添加到应用程序的复杂性而产生负面影响。因此,请确保您正在解决真正的问题,而不是过早优化。

现在,来看警告消息。检查定义在里面combineReducers()。这意味着意外的状态键将被丢弃。删除后bookEntry管理的减速器state.bookEntry,这部分状态不再被新的根减速器识别,并且combineReducers()记录了它将被丢弃的警告。请注意,这是警告,而不是错误。你的代码运行得很好。我们用console.error()使警告突出,但它实际上并没有抛出,所以你可以安全地忽略它。

我们真的不想让警告可配置,因为你本质上是隐式删除部分应用程序状态。通常人们这样做是错误的,而不是故意的。所以我们想对此发出警告。如果您想绕过警告,最好的选择是编写根减速器(当前由combineReducers()) 用手。它看起来像这样:

// I renamed what you called "root" reducer
// to "main" reducer because the root reducer
// is the combined one.
let mainReducer = (state, action) => ...

// This is like your own combineReducers() with custom behavior
function getRootReducer(dynamicReducer) {
  // Creates a reducer from the main and a dynamic reducer
  return function (state, action) {
    // Calculate main state
    let nextState = {
      main: mainReducer(state.main, action)
    };

    // If specified, calculate dynamic reducer state
    if (dynamicReducer) {
      nextState[dynamicReducer.name] = dynamicReducer.reducer(
        nextState[dynamicReducer.name],
        action
      );
    }

    return nextState;
  };
}

// Create the store without a dynamic reducer
export function createStoreWithoutDynamicReducer() {
  return Redux.createStore(getRootReducer());
}

// Later call this to replace the dynamic reducer on a store instance
export function setDynamicReducer(store, dynamicReducer) {
  store.replaceReducer(getRootReducer(dynamicReducer));
}

然而,我们推荐的模式是保留旧减速机 https://stackoverflow.com/questions/32968016/how-to-dynamically-load-reducers-for-code-splitting-in-a-redux-application.

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

ReplaceReducer 导致意外的键错误 的相关文章

随机推荐

  • ARMv8 浮点输出内联汇编

    为了添加两个整数 我写 int sum asm volatile add 0 x3 x4 r sum 我怎样才能用两个浮动来做到这一点 我试过 float sum asm volatile fadd 0 s3 s4 r sum 但这给了我一
  • 如何创建读取 shebang 的 Sublime Text 3 构建系统

    如何在 Sublime Text 3 中创建构建系统 cmd 是否被替换为 shebang 如果存在 更具体地说 是否有办法更改 Python 构建系统以使用 shebang 中指定的 Python 版本 并在不存在 shebang 的情况
  • AngularJS:为什么 ng-model 值没有在范围变量中更新

    我正在使用 jquery timepicker 插件及其角度指令 当我从 javascript 重置范围值时 同时范围值不会更新 我尝试对 timepicker 指令文件进行更改 但没有成功 例子 选择开始时间 1 00AM 然后结束时间自
  • geom_text 适用于 R 中的直方图?

    想知道是否geom text效劳于hist 尝试了下面的代码 似乎没有效果 我只想在为每个直方图桶绘制每个条形时显示标签 属于特定直方图桶的元素数量 任何解决方案表示赞赏 谢谢 p lt hist df foo main title xla
  • 从存储为节点缓冲区的字节数组创建类型化数组

    从节点docs https nodejs org api buffer html buffer buf slice start end关于从缓冲区创建类型化数组 缓冲区的内存被解释为数组 而不是字节数组 那 是 new Uint32Arra
  • 后台进程重定向到 COPROC

    在下面的测试脚本中 我运行一个基本协进程 echo内置 在后台运行 附加其标准输出 bin bash TEST 1 coproc bin sleep 100 echo gt COPROC 1 该脚本总是失败 没有明显的原因 给出输出 tes
  • 如何确定 .Net DLL 是否用于 GUI 应用程序或 Web 服务?

    如何确定 Net DLL 是否在 Windows GUI 应用程序或 Web 服务中运行 我有一个低级类 在两个应用程序之间共享 并且需要在 Web 服务中使用它时禁用消息框 Windows 应用程序有超过 200 个解决方案 我无法重构现
  • 将 !important 应用于具有多个选项的字体系列

    如何将 important 应用于以下样式 font family Trebuchet MS Verdana Helvetica Sans Serif 我已经尝试过这个 但不起作用 font family Trebuchet MS Verd
  • Prolog 程序返回命题公式中的原子

    我是序言新手 正在尝试编写一个返回atoms在一个结构良好的命题公式中 例如查询ats and q imp or p q neg p As 应该返回 p q for As 下面是我的代码 它返回的公式为As 我不知道该怎么做才能拆分sing
  • IIS7 URL从根目录重定向到子目录[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用带有 IIS7 的 Windows Server 2008 我需要重定向访问的用户www mysite com to wwww
  • oracle中的触发器

    触发器可以增强或阻碍性能的条件是什么 何时使用系统中的触发器 何时不使用触发器 如何使用触发器来施加复杂的约束 执行触发器总是会产生一些开销 至少 您要为导致触发器触发的每一行执行从 SQL 引擎到 PL SQL 引擎的上下文转换 虽然触发
  • JavaFX ObservableList - 添加项目导致 ConcurrentModificationException

    我有一张桌子Albums用户可以过滤和排序 这是该表的样子 正如您所看到的 这些列是可排序的 并且顶部有一个文本框 当前正在过滤其中包含字符串 cu 的专辑 一切都很完美填充专辑列表后 但是 如果我在填充专辑列表时尝试排序或过滤 我会得到一
  • c++ 不合逻辑 >= 处理 vector.size() 时的比较很可能是由于 size_type 是无符号的

    在处理 vector size 又名 size type 时 我可以使用一些帮助来澄清这种奇怪的比较 vector
  • 如何更改 jqgrid 中弹出的列选择器中的列名称?

    我有一个两列标题 Phase1 和 Phase 2 图像 1 现在在列选择器窗口中显示列名称 图 2 Name 类别 子类别 类别 子类别 我想以不同的方式展示 Name 一等奖组 一期子类别 Ph2组 Ph2子类别 注意 根据我的要求不要
  • 何时在 Ruby 中使用“self”

    这个方法 def format stations and date from station titelize if from station respond to titleize to station titleize if to st
  • 使用 Windows 身份验证对单个操作而不是整个应用程序进行身份验证

    我想在某个计算机上使用 Windows 集成身份验证进行身份验证单控制器动作而不是全局应用程序 我在网上和StackOverflow上阅读了很多文章 但没有找到答案 请注意 我正在 Web API 2 0 中进行开发 而不是 MVC 也就是
  • XMLHttpRequest 上传带有参数的文件

    我想使用 Safari 5 1 的 XMLHTTRequest 上传文件并在 POST 请求中传递参数 这如何实现 它应该是纯 JavaScript 而不使用任何 API 我这样做是因为 Safari 不支持 5 1 版本中的 FileRe
  • 为什么 Python 异常被命名为“Error”?

    为什么 Python 异常被命名为 Error 例如ZeroDivisionError NameError TypeError 而不是 例外 例如ZeroDivisionException NameException TypeExcepti
  • Google 群组和订阅代码

    我对任何领域的编程都是新手 刚开始我有一个添加订阅按钮的任务 我拥有的 Google 群组邮件列表 一个网站 我没有 Google 应用引擎 要求 非常简单 网站中的订阅按钮可以自动将人们订阅到邮件列表 语言 PHP HTML 不要问我有关
  • ReplaceReducer 导致意外的键错误

    我有一个 React 应用程序 它动态加载模块 包括模块的减速器函数 然后调用 Redux 的replaceReducer 来替换减速器 不幸的是我收到了一个错误 在传递给 createStore 的初始状态参数中发现意外的键 bookEn