【发布时间】:2019-10-30 04:06:30
【问题描述】:
我已经构建了我的 redux 应用程序,以便在状态树的不同分支上处理我的数据模型。
{concerts, venues}
我还使用 react-navigation-redux-helpers 将导航状态放入树中:
{concerts, venues, nav}
但是,我想记录有关特定模型的可见性状态的信息。当 ConcertScreen 显示时,我想知道用户何时查看/停止查看特定 Concert ID(并让服务器知道),最终目标是测量特定 Concert ID 在屏幕上可见的时间。
我通过将Navigation/NAVIGATE、Navigation/RESET 和Navigation/BACK 的分支添加到concerts reducer 并在concerts 下的适当对象上设置visible: true 来完成此操作。
这很容易出错,因为导航状态可以通过这些特定操作以外的操作进行修改。 (例如,由 nav reducer 直接处理的注销操作。)
我看到了两种选择,都不太理想:
使用
props.navigation.addListener在 ConcertScreen 上监听焦点和模糊事件,触发自定义concertFocused/concertBlurred操作,并在我的 Concert reducer 中处理这些操作,而不是Navigation/*操作。创建一个选择器,从
nav状态计算当前可见的 Concert,并重构期望concert.visible作为输入的业务逻辑以改用选择器。
1 的问题似乎是它增加了事件循环的开销,所有额外的动作都意味着额外的渲染开销。
2 避免了额外的操作,但似乎进行了很多重构却没有太多收获,这意味着我必须将业务逻辑从 Concert reducer 中移出并放在其他地方。
假设我使用选项 2。我添加了一个中间件,在任何操作中,该中间件将选择器应用于 state.nav 并从中计算 Concert 当前显示的内容。如果我想测量持续时间,我将如何存储开始/结束时间?使用添加的数据触发一个新操作,以便 Concert reducer 捕获它?这看起来就像带有额外步骤的选项 1。
我可以也让这个中间件向每个动作添加一个字段来指示 Concert 显示状态,并让 Concert reducer 在默认/失败情况下处理它。人们会这样做吗?
【问题讨论】:
-
如果我遇到同样的情况,我会使用你的解决方案2。
-
@FatihMertDoğancan,选项 2 最终看起来像选项 1,但有额外的步骤(更新了问题)。
-
我的胆量感觉会与解决方案 2 一致。但是这个描述很模糊,我明白你的意图,但不确定你是如何实现这个想法的。一些代码会很好。
-
创建一个专用的包装器组件(可能是 HOC)怎么样,而不依赖于导航或任何与 redux 相关的操作?在此组件中,您将拥有一个监听器,它将仅跟踪模型实例(音乐会 1、场地 1 等)的可见屏幕时间,并且在
componentDidUnmount上,您将在 Store 中保留/调度可见时间。你怎么看?如果适合您,我可以将其分解为答案。 -
@frank,您能否查看我的详细答案并提供反馈/问题(如果有)?谢谢:)
标签: reactjs react-native redux react-redux react-navigation