首页 文章

中继 . 访问兄弟组件的数据

提问于
浏览
0

使用Relay我遇到了访问数据的问题 . 我试图用Relay项目的官方Todo示例重现这些问题 . 请考虑要点以改变Todo的例子 . here

以下是问题:

  • 为什么Summary组件无法访问兄弟(查看器)组件数据?

  • "queries must have exactly one field"是什么原因?我相信GraphQL没有这样的限制 .

  • 为什么我有不变违规:Relay(TodoApp).getFragment(): summary 不是有效的片段名称?

提前致谢!

1 回答

  • 0
    • 无论 Summary 想要在查看器中使用什么数据,都必须在 Summary 容器中将其作为GraphQL声明,并一直编写到应用程序的根目录 .
    class Summary extends React.Component {
      render() {
        return <span>{this.props.viewer.bar}</span>;
      }
    }
    export default Relay.createContainer(Summary, {
      fragments: {
        viewer: () => Relay.QL`
          fragment on Viewer {
            bar
          }
        `,
      },
    });
    
    class TodoApp extends React.Component {
      render() {
        return <Summary viewer={this.props.viewer} />;
      }
    }
    export default Relay.createContainer(TodoApp, {
      fragments: {
        viewer: () => Relay.QL`
          fragment on Viewer {
            foo
            ${Summary.getFragment('viewer')}
          }
        `,
      },
    });
    

    请注意, foo 字段在 Summary 中不可用 . 我们掩盖了它,因为 Summary 没有要求它 .

    • 您可以在 Relay.Route 中有多个查询,但每个查询只能有一个根字段 . 我们需要这种一对一的对应关系,以便我们知道将哪个结果分配给哪个道具 .
    class MyRoute extends Relay.Route {
      queries: {
        summary: () => Relay.QL`query { summary }`,
        viewer: () => Relay.QL`query { viewer }`,
      },
      /* ... */
    }
    
    • 您需要将摘要片段一直组合到应用程序的根目录,使其在 TodoApp 上可用 .
    export default Relay.createContainer(TodoApp, {
      fragments: {
        summary: () => Relay.QL`
          fragment on Summary {
            ${Summary.getFragment('summary')}
          }
        `,
      },
    });
    

相关问题