1

何らかの理由で、子コンポーネントを注入する前にパラメーターを受け取るルート クエリを生成すると、次のようになります。

import Relay from 'react-relay';

export default {
  production: (Component) => Relay.QL`
    query {
      getProduction(id: $productionId) {
        ${Component.getFragment('production')}
      }
    }
  `
};

Relayはもともとこのクエリを生成します:

query MyProductionDetailsQuery($id_0:ID!,$where_1:ProductionRoleWhereArgs!) {
  getProduction(id:$id_0) {
    id,
    ...F0
  }
}
fragment F0 on Production {
  id,
  ...
  _roles4oPiwv:roles(first:10,where:$where_1) {
    edges {
      node {
        id,
        ...
      },
      cursor
    },
    pageInfo {
      hasNextPage,
      hasPreviousPage
    }
  }
}

変数:

{id_0: "UHJvZHVjdGlvbjoxNg==", where_1: {archived: {eq: true}}}

ただし、コンポーネントのリレー コンテナーに独自の変数がある場合、実行this.props.relay.setVariables({...variables})すると、リレーによって生成されたリクエスト クエリが次のように完全に変更されます。

query My_production_details_page_ProductionRelayQL($id_0:ID!,$where_1:ProductionRoleWhereArgs!) {
  node(id:$id_0) {
    ...F0
  }
}
fragment F0 on Production {
  id,
  _roles6J5gK:roles(first:10,where:$where_1) {
    edges {
      node {
        id,
        ...
      },
      cursor
    },
    pageInfo {
      hasNextPage,
      hasPreviousPage
    }
  }
}

変数:

{id_0: "UHJvZHVjdGlvbjoxNg==", where_1: {archived: {eq: false}}}

ただし、パラメーターのないルート クエリがある場合、setVariables は正常に機能します。

import Relay from 'react-relay';

export default {
  viewer: (Component, variables) => Relay.QL`
    query {
      viewer {
        ${Component.getFragment('viewer', { ...variables })}
      }
    }
  `
};

生成されたクエリは次のとおりです。

query ViewerQuery($where_0:ProductionWhereArgs!) {
  viewer {
    ...F0
  }
}
fragment F0 on Viewer {
  user {
    _productions2IPZAw:productions(first:10,where:$where_0) {
      edges {
        node {
          id,
          ...
        },
        cursor
      },
      pageInfo {
        hasNextPage,
        hasPreviousPage
      }
    },
    id
  }
}

変数:

{where_0: {expDate: {gt: "2016-11-04T16:29:11.677Z"}, archived: {eq: false}}}

作業セットアップで setVariables の後:

query ViewerQuery($where_0:ProductionWhereArgs!) {
  viewer {
    ...F0
  }
}
fragment F0 on Viewer {
  user {
    _productions1CyNvL:productions(first:10,where:$where_0) {
      edges {
        node {
          id,
          ...
        },
        cursor
      },
      pageInfo {
        hasNextPage,
        hasPreviousPage
      }
    },
    id
  }
}

変数:

{where_0: {expDate: {lt: "2016-11-04T16:34:12.537Z"}, archived: {eq: false}}}

バージョン:

"react-relay": "^0.9.3",
"react-router-relay": "^0.13.5"

構成に何か問題があるのか​​ 、それともRelay側の単なるバグなのかはわかりません.

この問題の原因を知っている人はいますか?

4

1 に答える 1

0

setVariables を実行すると、必要なデータのみが再取得されます。リレーは、変数の変更によってクエリのどの部分が影響を受ける可能性があるかを調べ、GraphQL サーバーからのリクエストにはフラグメントが必要でした。これは、ノード インターフェイス (つまり、不透明なリレー ID によるオブジェクトのフェッチ) が原因で可能です。詳しくはドキュメントを参照してください。

あなたの場合、GraphQLサーバーに本番タイプのNode Interfaceを実装する必要があると思います。

于 2016-11-04T00:28:14.323 に答える