如何在突变后使Relay的缓存无效

时间:2017-07-27 22:09:00

标签: javascript reactjs relayjs relay react-relay

我正在使用React / Relay / GraphQL重建一个小型内部Web应用程序,以熟悉此堆栈。基本上,它监控"活跃"的列表的分析。视频。唯一的突变是用新列表替换活动视频ID列表。 问题是,在更换ID后,Relay会继续提供旧ID列表而不是新ID。

我无法弄清楚如何操纵传递给commitMutation()的{​​{1}}和updater回调的商店。我只需要清除存储的活动视频列表,这样就可以调用一个新的视频,或让它重新运行graphql查询来刷新缓存。

具体来说,我需要清除此查询的结果:

optimisticUpdater

突变(TypeScript):

const ActiveVideosQuery = graphql`
    query App_ActiveVideos_Query {
        activeVideos {
            ...SetActiveVideosPage_activeVideos
            ...VideoList_activeVideos
        }
    }
`

架构:

const { commitMutation, graphql } = require('react-relay')


const mutation = graphql`
    mutation SetActiveVideosMutation($input: SetActiveVideosInput!) {
        setActiveVideos(input: $input) {
            clientMutationId
        }
    }
`

let nextClientMutationId = 0

function commit(environment, ids: string[]) {
    const clientMutationId = nextClientMutationId++

    return commitMutation(environment, {
        mutation,
        variables: { input: { ids, clientMutationId } },
    })
}


export default { commit }

1 个答案:

答案 0 :(得分:2)

您将要使用The Relay "Environment"

  

接力"环境"将Relay所需的配置,缓存存储和网络处理捆绑在一起以便运行。

Question为什么没有一个命令Relay.reset()只是从应用程序中删除所有内容?

Answer因为实例化一个新的Relay.Environment()而不是试图确保你已经清理了全局单例Relay.Store上的所有内容,它更加清晰。

编辑:回应你的评论;

  

Relay目前提供对重新获取数据的非常粗粒度的控制:primeCache默认使用内存数据来完成查询,而forceFetch绕过缓存并从服务器中完整地重新获取数据。同样,在实践中,这对我们的大多数用例都有效。


Refetching&缓存逐出控制 view issue

  

关于缓存逐出,了解Relay与许多典型缓存的根本区别在于它的重要性。典型的高速缓存存储独立的键/值对,而Relay高速缓存互连对象的图形。我们在ThinkingQL中广泛报道了这种影响。实际上,这意味着缓存驱逐的简单方法(如TTL或LRU)可能会产生不直观的后果。例如,产品通常关心查询,而缓存存储规范化记录。如果从缓存中逐出单个记录,则可能导致整个查询有效地丢失"并需要被重新提起。此外,应用程序的离散部分的数据依赖性可能重叠,因此它们不同意数据的允许陈旧性。