在react-apollo中建模可选的过滤器参数

时间:2017-09-23 17:41:03

标签: reactjs graphql apollo react-apollo

我正在使用react-apollo访问网络应用中的graphql

我有一个看起来像这样的查询,可以让我过滤游戏时间表:

query($pagination:Int!, $divisionId:ID, $teamId:ID, $startDate:DateTime!, $endDate:DateTime!
){
 games: allGames (
 orderBy: date_ASC,
 first: $pagination,
 filter: {
   date_gte: $startDate,
   date_lte: $endDate,
   division: {id: $divisionId},
   OR: [
    {homeTeam: {id: $teamId} },
    {awayTeam: {id: $teamId} },
   ]
  }
){
 id
 .... more fields
}

每个请求都需要startDateendDate个变量,但teamIddivisionId不是。我想在初始请求中显示所有teamIdsdivisionIds,并允许根据需要使用过滤/向下钻取。

我想看看我是否可以添加一个通配符(*)或类似的东西,但我不确定它是否可行。使用graphql突变,变量的null值允许我编写适用于多个用例的单个突变(部分更新和创建),但我无法弄清楚如何使用查询实现类似的功能。 / p>

我是否需要针对每个过滤器方案调用不同的查询(一个用于无divisionId& teamId,一个用于divisionId,一个用于teamId,另一个用于divisionId对于teamIddivision这两个问题是fragments能帮助我以更少的开销实现这一目标(因为最后一句使得这个过程看起来有点过于繁琐/不干)。

或者我将iddivision_in切换为id_indivisionIds并传递它们(稍大)数组,其中包含teamdIds和{{1}}的所有可能值{{1}}作为最初的道具?

1 个答案:

答案 0 :(得分:1)

所以事实证明你实际上将整个过滤器存储为变量(这非常棒)。

以下是更新的查询:

query( $first:Int!, $skip:Int!, $gameFilter:GameFilter! ){
  games: allGames (
    orderBy: date_ASC,
    first: $first,
    skip: $skip,
    filter: $gameFilter
  ){
    id
    ... more fields
   }
}

以及相应的HOC:

export default graphql(gamesQuery, {
  options: props => ({
    return { variables: {props.gameFilter}
  });
})(GamesPage);

给这些家伙提示: