为什么 Apollo 缓存(?)writeQuery() 会重新渲染一个查询组件

Why does Apollo cache (?) writeQuery() re render a query component

我正在使用 Apollo Client 开发一个 React 项目,并且有一个 cache.writeQuery() 调用导致相关查询组件的重新呈现。

详情见代码:

cache.writeQuery():

cache.writeQuery( {
    query : serverQueries.searchMessages,
    variables : {
        labelId : labelId,
        searchTerms : searchTermsString ? searchTermsString : null,
        )
    },

    data : { Messages : updatedData }
} );

Related query component that is re rendering:

<SearchMessagesQuery
            query={serverQueries.searchMessages}
            variables={{
                labelId: searchMailLabelId,
                searchTerms: searchTerms.asJSON,
            }}>

我不希望此查询组件重新呈现,从我读到的内容来看,似乎 cache.writeData() 允许这种行为。但是,cache.writeData() 显然不允许 variable 密钥,我需要更新 unique/individual searchMessages。如何使用 cache.writeData() 来执行相同的查询?

cache.writeData() 描述了更新单个项目(按类型)的用法 here

但是...恐怕它也会强制重新呈现查询组件。此行为来自 <Query/> 组件内部 - 创建一个 observable/subscription:

Apollo Client creates an observable for our query. Our component subscribes to the result of the query via the Apollo Client cache.

建议: 您可以使用 old graphql() HOC 来避免使用 cache.writeQuery() 重新渲染。我个人更喜欢使用更多 flexible/powerfull recompose pattern(f.e。用于组合多个查询、突变、本地状态、redux connect())的 HOC。