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

React Native中GraphQL查询如何传递动态Filter键值?

问题:React Native + GraphQL 动态Filter参数键值传递问题

我正在开发基于React Native和GraphQL的应用,现有如下查询:

{
 products(
 filter: {category_uid: {eq: "Mw=="}, bestseller: {eq: "44"}}
 sort: {name: ASC}
 pageSize: 10
 currentPage: 1
  ) {
total_count
items {
  uid
  name
  sku
  boutique_name
  small_image {
    url
    label
   }
  }
 }
}

该查询的filter参数包含bestseller这类筛选键,我共有bestseller、top_rated、new_arrivals、trending等5类筛选条件。当切换为new_arrivals时,查询需改为:

{
 products(
 filter: {category_uid: {eq: "Mw=="}, new_arrival: {eq: "45"}}
 sort: {name: ASC}
 pageSize: 10
 currentPage: 1
  ) {
total_count
items {
  uid
  name
  sku
  boutique_name
  small_image {
    url
    label
   }
  }
 }
}

但传递动态键时,键会被转为字符串(如下所示),导致报错:

{
 products(
 filter: {category_uid: {eq: "Mw=="}, "new_arrival": {eq: "44"}}
 sort: {name: ASC}
 pageSize: 10
 currentPage: 1
  ) {
total_count
items {
  uid
  name
  sku
  boutique_name
  small_image {
    url
    label
   }
  }
 }
}

请问如何在上述GraphQL查询中传递动态的Filter参数键值?


解决方案

方法1:用ES6计算属性名构建Filter对象(推荐)

这是主流GraphQL客户端(如Apollo Client)的标准做法,通过变量传递filter,并用ES6计算属性名动态设置键,彻底避免字符串引号问题。

示例代码(React Native + Apollo Client):

// 动态获取当前选中的筛选键和对应值
const activeFilterKey = 'new_arrival'; // 可从组件state/context中动态获取
const activeFilterValue = '45';

// 构建符合GraphQL输入类型的filter对象
const filter = {
  category_uid: { eq: "Mw==" },
  [activeFilterKey]: { eq: activeFilterValue } // 计算属性名实现动态键
};

// 带变量的GraphQL查询模板
const GET_PRODUCTS = gql`
  query GetProducts($filter: ProductFilterInput!) {
    products(
      filter: $filter
      sort: {name: ASC}
      pageSize: 10
      currentPage: 1
    ) {
      total_count
      items {
        uid
        name
        sku
        boutique_name
        small_image {
          url
          label
        }
      }
    }
  }
`;

// 发起查询
client.query({
  query: GET_PRODUCTS,
  variables: { filter }
});

方法2:模板字符串拼接查询(应急用)

如果无法使用变量,可在可控范围内用模板字符串动态拼接查询内容,但要确保筛选键是固定集合,避免注入风险:

const activeFilterKey = 'new_arrival';
const activeFilterValue = '45';

// 动态拼接查询内容
const query = gql`
  {
    products(
      filter: {category_uid: {eq: "Mw=="}, ${activeFilterKey}: {eq: "${activeFilterValue}"}}
      sort: {name: ASC}
      pageSize: 10
      currentPage: 1
    ) {
      total_count
      items {
        uid
        name
        sku
        boutique_name
        small_image {
          url
          label
        }
      }
    }
  }
`;

client.query({ query });

方法3:后端Schema调整(可选)

如果后端允许,可将动态筛选统一为通用字段,比如filter: {category_uid: {eq: "Mw=="}, tag: {eq: "new_arrival"}},这样前端无需动态修改键名,但需要后端配合调整GraphQL Schema的输入类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:20:40