gpt4 book ai didi

javascript - React-router-relay 与 Relay 模式不一致吗?

转载 作者:行者123 更新时间:2023-11-27 22:46:00 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

例如:

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

这里需要注意的一件事是,您不需要为片段命名,例如 fragment userFragment on User { ... }。通过声明 ${Component.getFragment(componentOneFragment)},从路由器中的中继查询动态引用组件片段时,这将为您提供更大的灵 active 。希望这有帮助!

编辑:

Use the same "viewer" query for every component and define a complimentary "viewer" fragment on each component. These fragments would all define different data requirements, despite having the same name, which seems very confusing.

虽然片段的相同名称可能看起来令人困惑,但这是思考问题的最佳方式。每个组件确实有不同的数据需求,因此它们的 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,
},
},
},
}
`
}
});

只要 UserWidget< 都可以在同一 GraphQL 查询中动态使用(即 $Component.getFragment('viewer'))/strong> 都是 Root Query 对象下的两种类型。

关于javascript - React-router-relay 与 Relay 模式不一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38415536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com