中继片段可选参数

Relay Fragment Optional Arguments

是否可以在创建中继查询时选择性地包含参数?

见下文我正在查询资源,我在这里对参数进行硬编码。

我想有条件地包含其中一些参数,例如 date_gt 和 date_lt。目前我必须为这些设置初始值,但由于我需要查询根本没有日期的记录,所以这会分崩离析。

如果我做不到,是否可以将 null 作为值发送给此处的参数,因为我目前也不太幸运。

    fragments: {
    viewer: () => Relay.QL`
        fragment on Viewer {
            resources( 
                    first: $pageSize
                    q: $q
                    type: $types
                    license: $licenses
                    order: $order
                    access_rights: "published"
                    orphan: true
                    date_gt: $dateFrom
                    date_lt: $dateTo
            )
            {
               total
               edges {
                    node {
                        ${ArticleResult.getFragment('resource')}
                    }
                }
                pageInfo {
                    hasNextPage
                }
            }
        }
    `
},

是的,我们可以提供 null 作为中继(客户端)中可选参数的值。

但是,我们也可以为这些可选参数提供默认值。例如,在 GraphQL 模式中,字段 resources 可以是这样的:

resources: {
  type: ResourceConnection,

  args: {
    // other args go here
    date_gt: {
      type: GraphQLString,
      defaultValue: '1970-01-01'
    },
    date_lt: {
      type: GraphQLString,
      defaultValue: '2030-12-31'
    },
    ...connectionArgs
  },

  resolve: async (root, {...otherArgs, date_gt, date_lt, ...args}) => {

    // Check date_gt and/or date_lt values. If they equal the default
    // invalid values, ignore them while calculating output. Sometimes it
    // is possible that the default values are good enough to be equivalent
    // of user-provided values.

    return output;
  },
},

如果我们不为可选参数提供默认值,我们可以将可选参数的值设置为null。在这种情况下,服务器端收到 undefined 值:

resources: {
  type: ResourceConnection,

  args: {
    // other args go here
    date_gt: {
      type: GraphQLString,
    },
    date_lt: {
      type: GraphQLString,
    },
    ...connectionArgs
  },

  resolve: async (root, {...otherArgs, date_gt, date_lt, ...args}) => {
    console.log(`date_gt: ${date_gt}, date_lt: ${date_lt}`);

    // Check date_gt and/or date_lt values. If they are not provided,
    // date_gt and date_lt are `undefined`. Calculate output accordingly.

    return output;
  },
},