【问题标题】:apollographql - changes to entries in objects in local state & re-rendering?apollographql - 更改本地状态对象中的条目并重新渲染?
【发布时间】:2026-01-04 19:25:01
【问题描述】:

假设我在我的本地状态中有一个对象,并且对该对象有两种类型的查询:-

anObject {

__typename: "AnObject"

thisThing: ""

thatThing: "" }

查询 1

{

anObject @client

}

查询 2

{

anObject @client {

thisThing }

}

2 个场景:-

一个组件正在运行查询 1,但它的渲染函数中没有使用 anObject.thatThing。

一个组件正在运行查询 2(它不查询那个东西)。

现在,假设另一个组件发生了变异 anObject.thatThing。我会假设场景 1 会导致组件重新渲染,因为它订阅了本地状态下的整个对象(通过查询 1),而在场景 2 中,如果 anObject.thatThing 发生突变,则组件不会重新渲染,因为它只是订阅了该对象的单个(不同)片段。对吗?

【问题讨论】:

    标签: reactjs apollo react-apollo apollo-client


    【解决方案1】:

    你有错误的假设。

    标准Query 不是SubscriptionObservableQuery - 它是一次性查询,不会强制自动更新/重新获取/呈现外部更改。

    您可以使用上面列出的选项或[最简单的]pollInterval 选项。

    对于更深层次的对象更新,您应该使用shouldComponentUpdate 方法。


    更新

    @client 指令更改默认查询行为。来自文档:

    调用client.writeData后,render prop函数上的查询结果会自动更新。

    它可能看起来像订阅,但实际上不是。在这两种情况下都会重新获取查询。子组件的重新渲染取决于其道具的变化。如果传递的道具不会更改,则不会重新渲染 - 对于相同的查询结果或仅传递/使用未更改的结果片段(对象属性)。

    【讨论】:

    • 上面的anObject 示例是我的客户端会话对象。我在那里有一个条目isAuthed。我运行client.writeData()isAuthedonClick() 处理程序从true 更新为false,整个应用程序也相应更新。使用 @client 指令时,查询可能是订阅?
    • 因此,如果我更改了对象中的一个条目 - 但该对象的查询未使用该条目(如上面的查询 2),那么它会使用查询 2 重新渲染组件吗?在我使用isAuthed...的真实示例中,我还将用户名等存储在本地状态的会话对象中。我只是在某个查询中查询isAuthed,以获取“登录”、“注销”等的条件渲染。
    • <Login isAuthed={data.sessionObj.isAuthed} /> 将仅针对此 prop (isAuthed) 更改重新渲染,而不针对 data.sessionObj.name - 无论 name 是否在查询中使用 - 子组件不依赖它。跨度>
    • 这个场景(不传递道具)怎么样? <Query query={SESSION_ISAUTHED}> {({ data }) => { return( {data.session.isAuthed ? <div>Authed</div> : <div>Is authed</div ) }} </Query>
    • 它将是整个data(查询结果)对象引用依赖...和无状态功能组件...总是呈现。
    最近更新 更多