使用 Apollo 客户端根据 React 组件中的节点类型值发出条件 GraphQL 请求

Posted

技术标签:

【中文标题】使用 Apollo 客户端根据 React 组件中的节点类型值发出条件 GraphQL 请求【英文标题】:Make conditional GraphQL request based on node type value in React component with Apollo Client 【发布时间】:2022-01-05 14:12:28 【问题描述】:

我正在使用 React 和 Apollo 客户端。

基于来自 GraphQL 响应的节点 type 值 (nodes.type),我想有条件地向以下查询 NodeTypeOneNodeTypeTwo 发出 GraphQL 请求。

// MyBlock.gql

export default gql`
  query NodeTypeOne 
    getNodesOne 
      nodes 
        id
        type
        title
      
    
  
`;

export default gql`
  query NodeTypeTwo 
    getNodesTwo 
      nodes 
        id
        type
        title
      
    
  
`;

所以在下面的 React 组件中,我想有条件地根据节点 type 值发出 GraphQL 请求。

import MyQuery from './MyBlock.gql';

const MyBlock = ( data: myType : Props) => 
  const  data  = useQuery<GqlRes>(MyQuery);

  const items =
    data?.items?.map((node) => 
      return 
        id: node.id,
        title: node.title,
      ;
    ) || [];

  return data?.items?.length ? (
    <Slider items=items />
  ) : null;
;

export default MyBlock;

我如何以干净有效的方式做到这一点?

【问题讨论】:

【参考方案1】:

由于您的查询将针对不同的解析器,因此您无法真正创建一个查询来定位 getNodesOne 或 getNodesTwo 解析器。 另一方面,useQuery 只能接受单个预定义查询的参数。 然后我会进行 2 个单独的查询并使用 apolloClient 挂钩有条件地调用正确的查询:

// MyBlock.gql

export const QUERY1 = gql`
  query NodeTypeOne 
    getNodesOne 
      nodes 
        id
        type
        title
      
    
  
`;

export const QUERY2 = gql`
  query NodeTypeTwo 
    getNodesTwo 
      nodes 
        id
        type
        title
      
    
  
`;




import QUERY1, QUERY2 from './MyBlock.gql';

const MyBlock = ( data: myType : Props) => 
const client = useApolloClient()
const [data, setData] = useState(null)

useEffect(() => 
  client.query(query: MyType === '?' ? QUERY1 : QUERY2)
  .then((data) => setData(data))
  .catch((err) => console.error(err))
, [myType])

if(!data) return null /* or a loader... */

const items =
  data?.items?.map((node) => 
    return 
      id: node.id,
      title: node.title,
    ;
  ) || [];

return data?.items?.length ? (
  <Slider items=items />
  ) : null;
;

export default MyBlock;

【讨论】:

【参考方案2】:

您可以选择多种设计模式来解决问题。对于您的用例,策略设计模式将顺利运行。 对于代码参考,你可以谷歌一堆例子。

这些来自我的参考:-

https://dev.to/wecarrasco/strategy-pattern-with-javascript-dha

https://gist.github.com/Integralist/5736427

【讨论】:

以上是关于使用 Apollo 客户端根据 React 组件中的节点类型值发出条件 GraphQL 请求的主要内容,如果未能解决你的问题,请参考以下文章

React + Apollo:GraphQL 错误数组未传递到组件中

React 函数组件中的多个 useLazyQuery 钩子(Apollo 客户端)

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

React Apollo - 孩子没有根据结果变化进行更新

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

即使没有 UI,我是不是需要绑定到组件才能使用 apollo react 客户端?