在 Flux/React 中设置页面标题是谁的工作?

Posted

技术标签:

【中文标题】在 Flux/React 中设置页面标题是谁的工作?【英文标题】:Whose job is it in Flux/React to set the page title? 【发布时间】:2015-07-28 15:16:09 【问题描述】:

假设我从 Facebook 流量聊天示例开始。有多个线程,每个线程都有消息。我想编写代码,以便当我单击导航到不同的线程时,我会相应地更改页面标题。

谁设置页面标题?

线程列表组件中的点击处理程序(不太可能) 组件调用的动作创建者 我创建的一个新商店,用于监听与导航相关的操作 一个新的 react 组件,实际上并不存在 DOM(页面标题有点像自定义视图组件,对吧?)

现在假设我想更进一步,在用户收到新消息时实现像 Facebook 这样的闪烁页面标题。当有新消息进来时,它会通过一些 Web 套接字或 AJAX 响应处理程序。

现在谁来设置页面标题?

这个新的消息处理程序 被处理程序调用的动作创建者 一些新店(见上文) 一些反应组件(见上文)

但是我这次设置标题的时候,我需要知道有多少条未读消息。在动作触发并且所有商店都更新了数据之前,我不知道这一点,所以前两个选项似乎已经失效。

编辑:

发布后,我发现this gist 似乎注册了调度程序的回调,但不是商店。这是正确的方法吗?如果不是商店,你会怎么称呼它?

【问题讨论】:

【参考方案1】:

标题是您的应用程序状态的一部分,因此您需要一个存储来保存它,例如TitleStore。当它发生变化时,您需要对窗口应用更改:

 TitleStore.on('change', function() 
   document.title = TitleStore.getTitle();
 );

或者您可以将其实现为 React 组件。它将在 mount 上应用更改(或使用此模块:https://github.com/gaearon/react-document-title)。

剩下一件事:改变商店的行动。您可能很想创建一个特殊操作,例如SET_TITLE,但这绝对是错误的。操作应该是用户所做的事情,而不是您想要发生的事情。相反,您应该使用现有的操作,例如LINK_CLICKEDTHREAD_SELECTED 等。其他商店会相应地对此操作做出反应,您可以在waitFor 的帮助下使用它们来更新标题。

【讨论】:

我猜你是在提倡我原来的问题中的选项 3 或 4。无论哪种方式,听起来我都应该在构成应用程序状态的其他商店上构建一个使用 waitFor 的 TitleStore。

以上是关于在 Flux/React 中设置页面标题是谁的工作?的主要内容,如果未能解决你的问题,请参考以下文章

在过滤器中设置默认语言后,JSP i18n 分别在每个页面上工作

Flux+React.js - 缓存 API 请求响应

如何在 django 中设置健康检查页面

阿里淘宝的S1级别bug,到底是谁的锅?

阿里淘宝的 S1 级别 bug,到底是谁的锅?

如何在设置页面中设置打开和关闭iphone声音的开关