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