NgRx - 状态如何组合和初始化

2024-04-24

当我们初始化 Store 时:

StoreModule.provideStore({r1: Reducer1, r2: Reducer2, ...})

我们确实将减速器传递到 Store 进行存储。但我们实际上从未将初始状态传递给存储,除了在减速器函数中定义它:

const someReducer = (state = initialState, act: Action) => { ... }

那么,是不是当应用程序引导时,所有的reducer都会被调用一次,从reducer定义中获取初始状态,然后将状态存储在NgRx Store中? 如果是这样,是不是每个reducer都必须有一个初始状态值?否则状态将永远是未定义的?

并且,如果在引导程序中调用所有缩减程序,NgRx 如何确保缩减程序必须达到默认情况?:

case ...:
   ...
default:
   return initialState

多谢! 任何帮助表示赞赏!


每次向商店发送操作时,every调用已注册的减速器。减速器只是一个函数,它接受当前状态加上一个操作并返回一个新状态。

所以是的,在引导时会调度一个 init-action (因此每个减速器都会被调用)。如果你使用商店开发工具 https://github.com/ngrx/store-devtools例如,您将看到初始操作被称为@ngrx/store/init https://github.com/ngrx/store/blob/master/src/dispatcher.ts#L9。 由于此时当前状态未定义,因此将使用以下命令调用减速器函数:someReducer(undefined, { type: '@ngrx/store/init' })

当使用以下参数调用函数时undefined并且它有一个带有默认值的参数,它将使用该默认值。

function funcWithoutDefault(myParam) {
    console.log(myParam);
}

funcWithoutDefault('hello'); // 'hello'
funcWithoutDefault(undefined); // undefined

function funcWithDefault(myParam = 'world') {
    console.log(myParam);
}

funcWithDefault('hello'); // 'hello'
funcWithDefault(undefined); // 'world'

这对你来说可能不是什么新鲜事。但希望它有助于回答您有关初始状态的问题:

正如我所说,目前的状态是undefined在调用 init-action 之前。因此,当reducer函数有一个带有默认值(初始状态)的参数时,存储将使用该初始状态进行初始化。 如果您没有为减速器定义默认值,则状态的切片将保持不变undefined。 这可能是一个有效的场景。例如,考虑一个处理管理部分操作的减速器。除非具有提升权限的用户使用您的应用程序,否则您可能不希望在该状态片中拥有任何内容。

现在我想你的问题来自于:

你不想退回initialState在默认情况下!由于每个减速器都会在每次操作调度时被调用,因此默认情况应该return state。 商店不知道某个操作的减速器的用途。它使用当前状态和分派的操作调用每个减速器,并期望返回一个(新的)状态。
某个减速器是否应对某个操作做出反应取决于您。不应对此操作做出反应的所有其他减速器都应返回其未更改的状态(via the default case)。当然,您可以让多个减速器对同一操作做出反应!

在你的情况下,如果每个减速器都返回initialState在默认情况下,您的整个应用程序状态将重置为其初始状态,除了对分派操作做出反应的减速器之外。

TL;DR 对于您的问题:

  • 是的,所有减速器函数都会在引导程序(以及所有其他操作调度)上被调用......
  • ...是的,那就是商店用初始状态初始化的时候。
  • 不,reducer 不一定总是有初始状态*
  • 如果状态切片最初是undefined,它仍然可以通过减速器通过返回新状态来对操作做出反应来改变。
  • 每个对动作没有反应的减速器都应该通过default-case.

* of course this only makes sense when the rest of your application is able to handle an undefined state

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

NgRx - 状态如何组合和初始化 的相关文章

随机推荐

  • 如何保护自己免受内存消耗失控导致电脑崩溃的情况?

    我时不时地发现自己做了一些相当愚蠢的事情 导致我的程序分配它可以获得的所有内存 然后分配一些内存 过去 这种情况会导致程序因 内存不足 错误而很快死掉 但现在 Windows 会不遗余力地将这些不存在的内存提供给应用程序 而且实际上显然已经
  • 如何查看JVM中JIT编译的代码?

    有什么方法可以查看 JVM 中 JIT 生成的本机代码吗 一般用法 正如其他答案所解释的 您可以使用以下 JVM 选项运行 XX UnlockDiagnosticVMOptions XX PrintAssembly 根据特定方法进行过滤 您
  • 反应 for 循环

    我正在学习 JavaScript React 我正在尝试为 React 网站上的 tic tac toe 示例创建一个简单的 for 循环 但到目前为止它还存在问题 奇怪的是 有几个映射示例 但没有 for 循环示例 无论如何 对于以下内容
  • 通用 .NET 类中的 public static (const)

    是否有语法技巧可以在不指定 临时 类型的情况下获取泛型类中的常量 public class MyClass
  • 如何在WPF中启动其他程序,例如Windows窗体process.start

    我在 Windows 窗体中使用 process start 来启动其他程序 但现在我想使用 wpf 来启动它 但我不知道如何以及与它等效的是什么
  • Paypal:客户端身份验证失败

    尝试让我的 paypal REST api 网站上线 它在沙箱模式下运行良好 并具有经过验证的传输 当我将沙箱切换为实时客户端 ID 和密钥时 出现错误 error invalid client error description Clie
  • Azure Functions不生成extensions.json

    我有一个具有多种功能的 Azure Functions 项目 由服务总线和 Blob 存储触发 他们已经构建并部署到 azure Fine 几个月了 某物最近发生了这样的事情 当您单击该函数时 它们不再从我的构建计算机进行部署 并在 Azu
  • FBSDKLog:在 Facebook SDK 初始化之前无法启动 FBSDKGraphRequestConnection

    我只是在我的 iOS 应用程序中使用 FBSDKCoreKit 8 1 0 最新 使用 Facebook Analytics 此错误消息不断淹没我的日志 FBSDKLog FBSDKGraphRequestConnection cannot
  • Django 模板上的 Unicode 字符串显示

    我正在使用 django v1 5 我将渲染一个名为 foobar 的变量 它是一个 json obj 包含 unicode 字符串 def home request import json foo name u 赞我们一下 bar jso
  • awk 中的并行处理?

    awk 逐行处理文件 假设每行操作不依赖于其他行 有没有办法让 awk 一次并行处理多行 是否有其他文本处理工具可以自动利用并行性并更快地处理数据 唯一尝试提供 awk 并行实现的 awk 实现是并行 awk http code googl
  • Python 在计算机睡眠/休眠后冻结

    我有一个使用 pythonw 在后台运行的 python 脚本 如果我关闭笔记本电脑 它就会进入睡眠模式 当我打开笔记本电脑时 我的程序几乎没有任何功能 并在几秒钟后冻结 有什么方法可以让我的脚本知道我的计算机是否进入睡眠模式 以便它可以处
  • PyQt 自动调整 qlineedit 字符间距

    我有一个 qlineedit 用户在其中输入验证码 我希望能够每隔 5 个字符自动间隔这些数字 就像激活自动添加破折号的窗口时一样 例如 12345 67890 12345 67890 如果位数是固定的 最好的选择是使用setInputMa
  • 银光。如何将 InlineUIContainer 内容中的文本与 RichTextBox 中的外部文本对齐

    任务 使 InlineUIContainer 的文本内容与外部文本内联 InlineUIContainer 内容的标准行为是当底部边缘与外部文本内联时 可以使用 RenderTransform 移动 InlineUIContainer 的位
  • CSS 文本对齐延迟与宽度动画

    我正在尝试将文本设置为动画 使其在页面加载时从左到右显示 这只需简单地设置即可完成 keyframes从 0 过渡max width至 100 然而 我的文本对齐设置似乎仅在动画完成后才应用 我只想让文本内容本身显示出我想要的位置 并假设我
  • Django ORM和链式select_相关

    如何使用 Django ORM 执行此查询 它是一个多重联接 从一个表链接到另一个表 关于 select 相关的 Django 文档 https docs djangoproject com en 2 2 ref models querys
  • 如何在一页上放置多个jssor滑块?

    当我尝试在页面上放置多个滑块时 只有第一个滑块有效 有什么办法可以让它们同时工作吗 搜索堆栈溢出后我发现了这个 请按以下方式初始化多个实例 var jssor slider1 new JssorSlider slider1 containe
  • 从另一个数据帧中减去一个数据帧,不包括第一列 Pandas

    我必须使用相同列的数据框 我的任务应该是从 df nap 中减去 df tot 而不触及第一列 A 最简单的解决方案是什么 谢谢你 import numpy as np import pandas as pd df tot pd DataF
  • 在仪表板标题中间对齐可变长度的文本

    我使用闪亮的仪表板包 标题需要有标题 文本和徽标 标题应位于左侧 文本应位于标题的中间 中心 徽标应位于右侧 仪表板侧边栏还有两个过滤器 选择输入 中间的文本显示用户选择 因此文本的长度根据不同的选择而不同 我没有 css 背景 也不知道如
  • 如何将参数传递给 DLL 初始化(例如,通过 LoadLibrary 加载时)?

    如何将参数传递给通过 LoadLibrary 加载的 DLL 的初始化函数 有可能吗 也就是说 无需求助于某种导出函数或共享内存 没有直接的方法 最简单的可能是通过环境变量 它们可以在调用之前轻松设置LoadLibray with sete
  • NgRx - 状态如何组合和初始化

    当我们初始化 Store 时 StoreModule provideStore r1 Reducer1 r2 Reducer2 我们确实将减速器传递到 Store 进行存储 但我们实际上从未将初始状态传递给存储 除了在减速器函数中定义它 c