1

我在一个项目中使用react-router-relay 。考虑到每个组件基本上都以一个与根查询同名的片段结束,这个设计对我来说似乎很不合适。每个组件不应该能够在根查询下拥有任意类型的唯一命名片段吗?这可能使用这个包还是我的想法有缺陷?

编辑:也许我的问题有点含糊。我的问题是,react-router-relay 定义的查询属性基本上有两条规则,它们强制执行在我看来是一种奇怪的设计模式。这两条规则是:

  1. 每个查询只能深入“一层”。
  2. 每个查询必须映射到使用它的组件上具有相同名称的片段。

这给您留下了一个场景,您可以:

  1. 对每个组件使用相同的“查看器”查询,并在每个组件上定义一个免费的“查看器”片段。尽管名称相同,但这些片段都会定义不同的数据需求,这看起来很混乱。
  2. 您为不同的组件创建唯一的片段名称,然后根据您要获取的数据类型使用不同的名称重复相同的确切根查询,这看起来非常愚蠢。
4

1 回答 1

1

好问题。当您处理 Relay 时,您的想法是正确的,因为每个组件都应该有自己的片段,以便查询本身准确地映射到该特定组件所需的数据。片段的命名可以随心所欲,但类型不能随意。它必须是根查询对象(或您将片段附加到的任何字段)下的声明类型。否则,该片段将抛出一个错误,指出您无法在 Query 或字段上查询该类型。

例如:

var componentOneFragment = Relay.QL`
    fragment on User {
        name
    }
`;

这里要注意的一件事是,您不需要为像fragment userFragment on User { ... }. 通过声明${Component.getFragment(componentOneFragment)}. 希望这可以帮助!

编辑:

对每个组件使用相同的“查看器”查询,并在每个组件上定义一个免费的“查看器”片段。尽管名称相同,但这些片段都会定义不同的数据需求,这看起来很混乱。

尽管片段的相同名称可能看起来令人困惑,但这是思考事物的最佳方式。每个组件确实有不同的数据需求,所以它们的 Relay 容器自然会有不同的分片,但仍然使用相同的分片名称。

此片段可能包含在需要用户数据的中继容器之一中:

const WidgetList = Relay.createContainer(/* ... */, {
  initialVariables: {
    color: null,
    size: null,
    limit: null
  },

  fragments: {
    viewer: () => Relay.QL`
      fragment on User {
        widgets(color: $color, size: $size, first: $limit) {
          edges {
            node {
              name,
            },
          },
        },
      }
    `
  }
});

虽然这个片段(仍然具有相同的名称)可能包含在另一个需要 Widget 数据的 Relay 容器中:

const ActionsList = Relay.createContainer(/* ... */, {
  initialVariables: {
    input: null
  },

  fragments: {
    viewer: () => Relay.QL`
      fragment on Widget {
        actions(input: $input) {
          edges {
            node {
              name,
            },
          },
        },
      }
    `
  }
});

$Component.getFragment('viewer')只要UserWidget都是 Root Query 对象下的类型,它们都可以在同一个 GraphQL 查询中动态使用(即)。

于 2016-07-17T04:01:48.293 回答