You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React+Apollo中使用不同变量值重新调用GraphQL查询?

嘿,我来帮你搞定这个问题!在react-apollo里动态更新变量并重新执行查询,有两种非常实用的方式,我给你一步步讲清楚:

方案一:用React状态驱动查询更新(推荐)

这是最符合React设计理念的做法——把查询变量放到组件的状态里,当状态更新时,Query组件会自动检测到variables属性的变化,然后重新执行查询。

下面是修改后的完整代码:

import React, { useState } from 'react'
import { gql } from 'apollo-boost'
import { Query } from 'react-apollo'

// 补全你的GraphQL查询(记得定义变量参数)
const CATEGORY_QUERY = gql`
  query GetCategories($limit: Int!, $cursor: String, $idcategory: Int!) {
    categories(limit: $limit, cursor: $cursor, idcategory: $idcategory) {
      id
      name
      # 其他需要的字段...
    }
  }
`

const Home = () => {
  // 初始化查询变量到组件状态
  const [queryVariables, setQueryVariables] = useState({
    limit: 20,
    cursor: "",
    idcategory: 0
  })

  const handleOnCategoryTouch = (id) => {
    // 更新state中的idcategory,保留其他变量原有值
    setQueryVariables(prevVars => ({
      ...prevVars,
      idcategory: id
    }))
  }

  return (
    <Query query={CATEGORY_QUERY} variables={queryVariables}>
      {({ loading, error, data }) => {
        if (loading) return <Text>Loading...</Text>;
        if (error) return <Text>Error :(</Text>;
        
        // 渲染分类列表,绑定点击事件触发变量更新
        return (
          <div>
            {data.categories?.map(category => (
              <div 
                key={category.id} 
                onClick={() => handleOnCategoryTouch(category.id)}
                style={{ padding: '10px', borderBottom: '1px solid #eee' }}
              >
                {category.name}
              </div>
            ))}
          </div>
        )
      }}
    </Query>
  )
}

export default Home
方案二:手动调用refetch方法

如果你不想用状态驱动,也可以直接通过ref获取Query组件的实例,然后调用它的refetch方法手动触发查询:

import React, { useRef } from 'react'
import { gql } from 'apollo-boost'
import { Query } from 'react-apollo'

const CATEGORY_QUERY = gql`Some query here`

const Home = () => {
  // 创建ref引用Query组件
  const categoryQueryRef = useRef(null)

  const handleOnCategoryTouch = (id) => {
    // 调用refetch传入新变量,触发查询
    categoryQueryRef.current?.refetch({
      limit: 20,
      cursor: "",
      idcategory: id
    })
  }

  return (
    <Query 
      ref={categoryQueryRef}
      query={CATEGORY_QUERY} 
      variables={{ limit: 20, cursor: "", idcategory: 0 }}
    >
      {({ loading, error, data }) => {
        if (loading) return <Text>Loading...</Text>;
        if (error) return <Text>Error :(</Text>;
        // 渲染你的业务内容
        return <div>Your content here</div>
      }}
    </Query>
  )
}

export default Home

小提示

  • 优先选择方案一,因为它完全遵循React的单向数据流原则,代码更易维护,也不容易出现逻辑漏洞。
  • 不管用哪种方式,更新变量时尽量保留原有参数(比如limit和cursor),除非你确实需要重置它们。

内容的提问来源于stack exchange,提问作者Mozak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:29:00