问题标签 [fluxor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 与 3 个子组件共享状态和处理事件 | 通量器
我是 Fluxor 和它所基于的 redux/flux 模式的新手。我目前正在从事 Blazor wasm 项目。我选择使用fluxor进行状态管理。但我想知道如何处理以下情况:
当页面被加载时,组件 1 会通过 Fluxor 状态管理填充来自 API 的数据。
组件 1 是一个列表,其中包含用户可以选择的项目。单击该项目时,应从 API 检索并在组件 3 中完整显示。表示活动项目的文本显示在组件 2 中。
组件 2 是一个导航器,它使用简单的后退和下一步按钮浏览列表。单击下一步时,组件 3 应从 API 检索下一个项目并完整显示该项目。然后,组件 1 通过显示选择了列表的哪个项目来反映此更改。
我确实有行动等来获得完整的项目。我只是不确定从哪里发送它。或者如何确保所有组件都知道活动项目是什么。使用“纯” blazor,我将通过事件回调来完成所有这些,并在本地处理活动项目状态。但这会破坏通量器的意义。
c# - 在 .cs 文件的常规类中引发 Fluxor Action
请熟悉 Fluxor 或 C# Dependency Injection 的人帮助我解决我困扰了几天的问题。
在 Blazor 组件中使用 Fluxor 时,您可以包含以下内容来引发操作:
这允许您在组件内引发一个动作 Dispatcher.Dispatch(new MyAction(MyParameter))
:
除了从 Blazor 组件分派 Fluxor Actions(我工作得很好)之外,我还需要能够从 .cs 文件中的常规类分派 Action。我已经尝试过注入,如下面的 TestClass 所示,但是在被击中NullReferenceException
时会引发a 。Dispatcher.Dispatch
显然,必须实例化声明的 Dispatcher,private IDispatcher Dispatcher { get; set; }
但我认为实例化发生在 Startup.cs 中,如下所示:
显然我在这里遗漏了一些东西,但我对那是什么感到困惑。有人可以给我一些关于如何在常规 .cs 文件中包含的类中引发 Fluxor Action 的指导。谢谢。
使用 Peter Morris 建议的构造函数注入,我将测试类更改为:
但是,我现在正在努力解决的是当我实例化我的类时,如何获得对可以传递给 TestClass 构造函数的 Fluxor Disptacher 的引用?我认为 Fluxor 是作为服务实现的,即;
...这就是它以某种方式在全球范围内可供参考。
下次更新...
我的 TestClass 已更改为实现接口,现在在 Startup.cs 中注册为范围服务
启动.cs
由于这些更改,我期望 TestClass 会被实例化,并且我能够调用它的InitiateAction
方法来调度一个动作。但是,它在以下代码中仍然顽固地为空:
更新...我的 DeviceListener 类实现了 Cometd.Bayeux.Client.IMessageListener 接口并定义了一个回调,当从服务器进程接收到未经请求的消息时执行该回调。它在 Startup.cs 中被引用:
该类的结构如下:
所有在上面的 DeviceListener 中都有说明,我希望能够从内部调度 Fluxor Action onMessage
。
上面的 DeviceListener 显示了一个参数化的构造函数,但实际上会导致listener.subscribe(new GWS.DeviceListener());
Startup.cs 中的参数编译错误
dependency-injection - StateSubscriber.Subscribe 未处置
我正在使用 Fluxor 开发一个服务器端应用程序,该项目现在包括六个 Actions 以及相应数量的 Reducer 和 Effects。完成后,我预计会有 20 多个带有相关减速器和效果的动作。
Fluxor 的状态管理运行良好,但是当我构建项目时,我开始随机收到以下 InvalidOperationException:
我的代码中没有引发异常 - 它只是弹出。StackTrace 并没有给我太多的帮助,我对如何诊断和纠正这个问题有点困惑。
当异常发生时,我的应用程序崩溃,然后通常会在启动时立即再次显示异常。Rebuild All 似乎清除了它,但我怀疑存在垃圾收集/内存管理问题。
在我的代码中,我没有明确地处理任何 Fluxor 对象,并且期望在 Fluxor 框架中处理这些对象。然而,“StateSubscriber.Subscribe”让我想知道我是否应该处理 Fluxor 对象。有人可以给我一些最佳实践指导吗?
我正在使用 Fluxor 3.1.1,看到 3.2 刚刚发布。我会升级到那个,看看是否有任何变化。同时,我们将不胜感激有关如何诊断此问题的任何想法。
blazor - 使用 Blazor Fluxor 进行状态管理
所以我想在我的 blazor 服务器端应用程序中实现状态管理。我的目标是在网格中进行选择后调用一个动作。然后应将网格的值添加到状态中。我现在的问题是,我如何在州获得一些东西?该示例仅显示了如何增加计数,但我如何将应用程序中的数据获取到 reducer 或 action 中?
c# - Blazor 服务器端 Fluxor Dispatch Action on Browser 选项卡关闭
第一个 SO 帖子,所以如果我的问题没有充分组合,请告诉我!
用例:用户打开浏览器,然后按下“在设备上付款”按钮。我调度了一个 PayOnDevice 操作,它将 UI 更新为加载状态。我有一个 HandlePayOnDevice [Effect] 方法,该方法会执行该操作并异步启动设备以进行付款。当用户将卡插入设备时,支付成功/失败,异步方法解析并将 UI 更新为成功/失败。但是,如果浏览器在异步方法解析之前关闭,我想让设备完成并告诉另一个服务设备支付成功或失败。
问题:我可以通过覆盖 FluxorComponent 的虚拟 Dispose(bool disposing) 方法来调度操作“BrowserClosed”,从而在技术上做到这一点。然后,当原始设备异步方法解析时,我可以检查 IState 以查看浏览器是否关闭,以了解是否更新 UI 或使用结果更新其他系统。这是覆盖 Dispose 方法:
在此 dispose 方法中调用 Dispatch 的问题是渲染逻辑中断,因为组件已被释放,因此引发错误(但 IState 仍在更新,因此我的 Effect 方法仍然可以辨别是更新 UI 还是不同的服务) :
从技术上讲,即使抛出了这个错误,我仍然可以做我需要做的事情,但我认为我不应该因为错误而走这条路(我希望这是可以避免的!)并且想知道是否有另一种方法做到这一点。我认为可能有一种方法可以创建 Scoped CircuitHandler 来调度动作,但我不知道如何将 IState/Dispatcher 注入到该电路处理程序中。此电路处理程序失败:
这会导致启动时出错:
任何帮助将不胜感激!
c# - Fluxor Blazor 如何保存列表?
我正在开发一个 Blazor 应用程序,在这个应用程序中,我需要存储用户选择项列表的状态。当用户按下“保存更改”按钮时,我想将列表存储在状态中。
到目前为止,我已经编写了 Fluxor 文档中的四个强制性类:
服务状态:
服务特色
选择服务操作:
和 SelectServiceReducer:
我已经尝试了很多东西,但似乎没有任何效果存储在状态中的列表总是空的,但有趣的是在 SelectServiceAction 类中:
如果我在最后一个 } _serviceList 中放置了一个断点,则正确地包含了我传递给调度程序的列表中包含的所有项目。似乎问题出在 ServiceState 本身,
你碰巧知道我做错了什么吗?如果您需要我显示更多代码,我会发布它,我提前感谢您。
dependency-injection - Blazor 服务器范围的服务、关闭的连接、垃圾回收
如果我有范围服务:
在该服务中,发出一个 HTTP 请求:
我在这里读到,对于AddScoped
服务,服务范围是 SignalR 连接。
如果用户在返回之前关闭浏览器选项卡response
,MyScopedService 代码仍会完成。
有人可以解释那个 MyScopedService 实例会发生什么吗?什么时候被认为超出范围?代码完成后?垃圾收集的时间是否可预测?
我有一个使用范围依赖注入(fluxor和 CircuitHandler)的 Blazor 服务器项目,我注意到应用程序总内存随着每个新连接而增加(显然),但需要一段时间(分钟)才能获得内存关闭浏览器选项卡后关闭。
只是想知道这是否是预期的,或者我是否可以做一些事情让内存使用恢复得更快。或者,我的范围服务可能有问题。
c# - 我们如何在 ItemProviderDelegate 中等待 Action/Effect 的结果?
在我的 razor 组件中,我使用了一个Virtualize
组件(此处的文档),ItemsProviderDelegate
该组件被实现为一种async
从 API 批量加载数据传输对象 (DTO) 的方法。该方法看起来像这样:
这已被证明是一种有效的方法来渲染来自后端模型集合的批量数据,这些数据可能非常大,同时保持请求大小很小。客户端应用程序一次只需要从 API 请求少量对象,而 UI 不需要愚蠢的“页面”控件,因为用户可以直观地滚动浏览显示数据的组件。
Fluxor 用于管理客户端应用程序的状态,包括组件已请求的当前 DTO Virtualize
。这抽象了从 API 请求批量 DTO 的逻辑,并允许根据哪个组件调度操作来触发副作用。
应用程序中的许多Action
类型都有一个object? Sender
属性,其中包含对调度操作的组件的引用。当组件中发送所需操作的原始方法不需要从操作返回的结果状态时,此方法有效。然后效果可以根据发送动作的组件的类型调用回调方法,例如:
当OnSuccessfulUpdate
被上述效果调用时,此操作的减速器将更新状态,因此回调方法可以依赖最新的状态信息。
AnItemsProviderDelegate
对这种方法提出了一个有趣的例外。为了正确实现委托,我们需要返回项目列表和服务器上可用项目的数量。LoadDtosAction
此信息存储在此功能的状态中,当成功时由减速器更新。在当前的实现中(上面一般表示),该LoadDtosAsync
方法做了两个我不喜欢的假设:
状态值在被分派
isLoading
时立即设置为 true 。LoadDtosAction
我不认为这总是正确的,因此组件有时会立即询问状态值以更新自身(这将导致显示先前的状态而不是结果状态)。生成的 action-reducer-effect 链最终会将状态
isLoading
值更新为false
。
是否有一种方法可以让ItemsProviderDelegate
实现分派LoadDtosAction
并“等待”操作的结果以返回ItemsProviderResult
?
- 编辑 - 动作流程如下所示:
c# - 状态存储在fluxor中的什么位置?
我是使用状态管理的新手。目前我正在开发一个 blazor 应用程序,我偶然发现了“fluxor”框架,它允许通过通量模式进行状态管理。Fluxor 对我来说工作得很好,但是我似乎无法弄清楚页面状态的实际存储位置。它是在缓存中,数据库还是其他一些奇特的方式?有没有办法让我在浏览器中查看存储的数据?
顺便说一下,我在我的应用程序的客户端使用了fluxor。
谢谢你的协助!
redux - Blazor 中的状态管理选项
Blazor 中有哪些库/技术可用于 webassembly (wasm) 的状态管理。
很高兴知道不同方法的优缺点。