我正在尝试将 Backbone.Marionette 应用程序替换为 React,并且在考虑查询参数时遇到了困难。我想我在理解这种模式时错过了一个非常简单的和平,所以如果这个问题完全是无稽之谈,我深表歉意。我将不胜感激任何支持或只是指出我可以更具体地使用谷歌搜索的一些方向。
有一个/users
列出用户的页面,您可以通过搜索栏过滤用户。因此,如果您想过滤用户名中包含 'joe' 的用户,我将使用查询参数向服务器发出请求,例如/users?username=joe
. 此外,我也可以通过添加page
参数来进行分页( /users?username=joe&page=1
)。
如果我只考虑功能,流程可能是
- 客户端插入
joe
到 input 元素并单击Search。 - 单击“搜索”按钮会触发一个
Action
(如 Action.getUser)。 - 在
Action
向服务器请求并接收结果 - 将
Dispatcher
带有结果负载的函数分派给Store
对 感兴趣的任何人(通常是)Action
。 - 在
Store
由接收到的新结果状态变化Action
- View (
Component
) 通过侦听Store
的更改重新呈现。
它按预期工作。但是,我希望客户端能够为当前过滤的结果添加书签,并能够在一段时间后返回到同一页面。这意味着我需要在某个地方保存有关客户所做的搜索词的明确信息,这通常是 url(我说得对吗?)。因此,我需要使用查询参数更新 url 以保存搜索词 ( /users?username=joe&page=1
)。
我感到困惑的是在哪里以及何时更新网址?我现在能想到的是下面的 2 个选项——它们似乎一点也不干净。
选项1
- 客户端插入
joe
到 input 元素并单击Search。 - 单击“搜索”按钮会使用新的查询参数 (
/users?username=joe&page=1
)触发 ReactRouter 的转换。 - View(
Component
) 通过this.props.params
和接收新参数this.props.query
。 - View(
Component
) 会根据它接收到的查询参数触发一个Action
likeAction.getUser
- 在这种情况下username=joe&page=1
。
在这之后,它和上面一样
选项2(只有6个与我上面解释的不同)
- 客户端插入
joe
到 input 元素并单击Search。 - 单击“搜索”按钮会触发一个
Action
(如 Action.getUser)。 - 在
Action
向服务器请求并接收结果 - 将
Dispatcher
带有结果负载的函数分派给Store
对 感兴趣的任何人(通常是)Action
。 - 在
Store
由接收到的新结果状态变化Action
- View (
Component
) 通过侦听Store
的更改重新呈现。并且以某种方式(我不知道如何)根据其props
(例如this.props.searchusername
, 和this.props.searchpage
)更新其 url
处理查询参数的最佳实践是什么?(或者这可能不是特定于查询参数)我是否完全误解了设计模式或架构?在此先感谢您的支持。
我读过的一些文章