新的 Relay hooks API 将重点放在“render-as-you-fetch”的 React 模式上,到目前为止我真的很喜欢这个。中继useQueryLoader
和usePreloadedQuery
钩子在大多数情况下使实现这一点非常简单。
然而,我正在努力寻找一个关于如何在路由方面实现这种模式的好模式。我发现有两种典型情况使这难以实现。
情况一:
- 用户加载主页 (
example.com/
) - 用户深入应用程序树的一部分 (
example.com/settings/user/security/authentication
) - 然后他们点击一个链接将他们带到他们应用程序中完全不相关的部分(
example.com/blog/post-1
)
情况乙:
- 用户使用 URL 栏转到应用程序的某个部分,而不是使用链接 (
example.com/blog/post-1
)
example.com/blog/post-1
对于这些示例,有两种结果,用户要么通过嵌套子组件或直接通过 URL转到路由 ( )。所以我们为这条路线获取数据的方式必须支持这两种方法。
我假设我们希望尽早触发此路由的获取,因此当用户单击链接或我们在页面加载时检测到此路由时。
我可以想到三个想法来实现这一点:
- 改用一个
fetch-then-render
模式(比如 Relay 的useLazyLoadQuery
钩子) - 存储一个函数(比如在上下文中),并让该路由的所有链接在其
onClick
方法useEffect
中调用该函数,如果没有加载数据,或者查询的引用已过时,还有一个用于该路由的调用该函数 - 使用
render-as-you-fetch
函数但实现它们以fetch-then-render
支持
方法一:
这违背了render-as-you-fetch
模式的目的,但它是一种简单的出路,更有可能是一种“更清洁”的方式来实现为路由获取数据。
方法二:
在实践中,我发现这很难实现。通常,指向路由的链接与组件渲染路由所在的组件树的一部分断开连接。并且使用上下文意味着我必须loadData
为特定路线管理不同的功能(当涉及变量等时这可能会很棘手)。
方法3:
这就是我目前一直在做的事情。在实践中,它通常会导致能够将加载数据函数传递给附近的组件,但是如果断开连接的组件、URL 或页面重新加载等访问路由,则组件会退回到调用加载useEffect
钩子中的数据函数。
有没有人对他们如何实现这一点有任何其他想法或例子?