【发布时间】:2019-05-04 08:54:11
【问题描述】:
我有一个共同的 Header 和 Footer 显示可能已经在中继存储中的数据,而主要的 PageComponent 期望来自“查询”的数据,但我不想显示完整的加载屏幕给用户,我想在中间显示页眉、页脚和加载屏幕或内容。
所以,如您所知,如果我将所有内容包装在 QueryRenderer 中,我将有两个选择:查询正在“加载”或数据可用:
<QueryRenderer
{...usualProps}
render={({ error, props }) => {
<div className="app-wrapper">
{ props || error ? <PageComponent {...props} error={error} /> : <div>Loading...</div>}
</div>
}}
/>
假设我有一种方法可以手动从存储中检索数据(因为我们没有从存储中进行部分渲染之类的东西),我可以将该信息传递给常见的 Header 和 Footer,而主要查询正在加载:
<QueryRenderer
{...usualProps}
render={({ error, props }) => {
<div className="app-wrapper">
<Header {...storeProps} {...props} />
{ props || error ? <PageComponent {...props} error={error} /> : <div>Loading...</div>}
<Footer {...storeProps} {...props} />
</div>
}}
/>
我发现既然我有环境,我可以做这样的事情来从商店获取信息:
const storeProps = relayEnvironment.getStore().lookup({
dataID: 'client:root',
node: query().fragment, // special query with only the information I need for the `Header`
variables: {}
});
但是我有几个问题:
- QueryRenderer 在卸载时处理数据 :cry: (虽然我从中读取的信息也应该由 Query 检索,但从存储中读取更像是查询返回时的后备)
- 语法看起来很老套
- 我必须创建一个查询并编译它(无论如何我都可以忍受)
可能我以错误的方式解决问题,也许有人做了类似的事情,可以给我一些建议。
(如果没有任何效果,我的计划 B 是使用 getDerivedStateFromProp 将查询信息发送到自定义上下文并将其保存在那里以避免存储 GC 问题,例如)。
TL:DR:我想在查询完成加载时从存储中加载数据,然后使用查询返回的数据。
有什么想法吗?如果有不清楚的地方请告诉我
【问题讨论】:
-
当查询未完成时,props 将返回 null,您可以将其用作加载状态吗?喜欢
if (!props) return <Loading />
标签: relayjs relay relaymodern