如何将计算状态添加到 React Apollo 中的图形对象?

Posted

技术标签:

【中文标题】如何将计算状态添加到 React Apollo 中的图形对象?【英文标题】:How can I add computed state to graph objects in React Apollo? 【发布时间】:2018-07-31 12:11:53 【问题描述】:

我真的很喜欢让组件请求自己的数据的 graphQL 模式,但是某些数据属性的计算成本很高,所以我想本地化逻辑(和代码)来做到这一点。

function CheaterList( data:  PlayerList: players  ) 
  return (
    <ul>
      players && players.map(( name, isCheater ) => (
        <li key=name>name seems to be a isCheater ? 'cheater' : 'normal player'</li>
      ))
    </ul>
  );


export default graphql(gql`
  query GetList 
    PlayerList 
      name,
      isCheater
    
  
`)(CheaterList);

架构如下:

type Queries 
    PlayerList: [Player]


type Player 
    name: String,
    kills: Integer,
    deaths: Integer

所以我想将 isCheater 属性添加到 Player 并使其代码为:

function computeIsCheater(player: Player)
    // This is a simplified version of what it actually is for the sake of the example
    return player.deaths == 0 || (player.kills / player.deaths) > 20;

我该怎么做?

另一种表述方式是:如何让 isCheater 属性看起来像是来自后端? (但是,如果应用了乐观更新,则该函数应在新数据上重新运行)

【问题讨论】:

根据docs,您似乎可以将第二个参数传递给graphql 以传递计算属性? @Varinder 这就是您将属性传递给查询的方式,这与我在这里询问的不同。 是的,Arbitrary Transformation 有什么帮助吗? 不,这相当于从组件本身计算属性值。我希望每个组件只声明它需要Player isCheater ,然后显示数据,类似于数据来自远程的情况。 【参考方案1】:

注意:本地状态管理现在包含在 apollo-client 中——无需添加单独的链接即可使用本地解析器和 @client 指令。有关混合本地和远程字段的示例,check out of the docs。原始答案如下。

只要您使用的是 Apollo 2.0,这应该可以通过将 apollo-link-state 用作 outlined in the docs 来实现。

修改您的客户端配置以包含apollo-link-state

import  withClientState  from 'apollo-link-state';

const stateLink = withClientState(
  cache, //same cache object you pass to the client constructor
  resolvers: linkStateResolvers,
);

const client = new ApolloClient(
  cache,
  link: ApolloLink.from([stateLink, new HttpLink()]),
);

定义您的仅限客户端的解析器:

const linkStateResolvers = 
  Player: 
    isCheater: (player, args, ctx) => 
      return player.deaths == 0 || (player.kills / player.deaths) > 20
    
  

在查询中使用@client 指令

export default graphql(gql`
  query GetList 
    PlayerList 
      name
      kills
      deaths
      isCheater @client
    
  
`)(CheaterList);

但是,在单个查询中组合本地和远程字段目前似乎已被破坏。您可以跟踪一个未解决的问题here。

【讨论】:

以上是关于如何将计算状态添加到 React Apollo 中的图形对象?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从客户端添加到 Apollo?

如何在 React 组件中向 Apollo 客户端添加新的授权标头?

如何使用 react-apollo graphql 确定突变加载状态

如何管理 react + apollo 应用程序的状态

Graphql,react-apollo如何在加载组件状态时将变量传递给查询

如何在 Apollo 客户端的初始化中使用来自 React 的全局数据?