【问题标题】:Delegating fragments to children with Relay使用 Relay 将片段委托给孩子
【发布时间】:2017-05-13 05:32:04
【问题描述】:

我想在组件中做这样的事情:

Relay.createContainer(Component, {
  fragments: {
    thing: AnotherComponent.getFragment('thing')
  }
}

这将理想地设置我当前组件上的片段thing 以在其子组件之一上使用片段thing。有效地将了解thing 的责任委托给任何使用它的人。然后包含Component 的组件可以调用Component.getFragment('thing'),后者将调用AnotherComponent.getFragment('thing')

有人知道怎么做吗?

更新

我发现完成这项工作的唯一方法是通过像

这样的语法
Relay.createContainer(Component, {
  fragments: {
    thing: Relay.QL`
      ${AnotherComponent.getFragment('thing')}
    `
  }
}

这会正确命中服务端,服务端执行AnotherComponent指定的查询,但是现在Component的props中没有提供查询的返回值

更新 2

我发现这种类型的重复嵌套会产生如下查询:

query Router {

  store {

    ...F3

  }

}
fragment F0 on Store {

  _fields2w4En2:fields(labels:["Country","Function"],owner_type:"requisitions") {

    choices {

      id,

      label

    },

    id
,

    label
  }

}
fragment F1 on Store {

  ...F0

}
fragment F2 on Store {

  ...F1

}
fragment F3 on Store {

  ...F2

}

在基层我有这样的查询:

export default Relay.createContainer(SearchBar, {
  fragments: {
    searchFields: () => Relay.QL`
      fragment searchFields on Store {
        searchFields: fields(labels: ["Country", "Function"], owner_type: "requisitions") {
          label
          choices {
            id
            label
          }
        }
      }
    `,
  },
});

【问题讨论】:

    标签: reactjs graphql relayjs


    【解决方案1】:

    所以直截了当的方法不起作用的原因是因为getFragment 实际上并没有返回片段(呃),而是对特定于声明它的容器的片段的引用。幸运的是,你可以从中得到简单的片段, 与:AnotherComponent.getFragment('thing').getFragment()

    请参阅this playground example 进行演示

    【讨论】:

    • 哇哦。你是如何/在哪里找到的?我到处找。现在唯一的问题是片段查询fields,它返回一个数组。当它被传递到下一个组件时,Relay 抱怨它需要一条记录并且片段上没有 @relay(plural: true) 。问题是,它不应该有复数:true,因为数组是在 fields 查询中解析的。如果是{choices {id label} },那么该片段可以有复数,但由于fields 在原始片段中,它不应该需要复数:true。
    • 这一切都有效,但是对于使用它的每个组件,我都会收到此警告 `RelayContainer: component Heade` 是使用与用于获取片段存储的变量不同的变量呈现的。片段是使用变量获取的(未获取),但使用变量 {} ` 呈现
    • 可能没有通过每个片段的变量...似乎无关?请注意,您可能需要这样做 .getFragment('thing', variables).getFragment(variables)
    猜你喜欢
    • 2018-02-18
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2018-05-07
    • 2017-02-05
    相关资源
    最近更新 更多