gpt4 book ai didi

reactjs - Apollo客户端的片段组合: convention and boilerplate

转载 作者:行者123 更新时间:2023-12-03 13:37:11 26 4
gpt4 key购买 nike

在 Apollo 应用程序(也包括 GraphQL/Relay)中,人们可以选择将数据需求并置到组件中,或者最终自己组装大型 GraphQL 查询。我们选择将数据需求并置到组件中,因为我们期望从长远来看有更好的可维护性,因为您不需要查看整个组件树或页面来查看所有数据需求,并且可以在本地添加新需求。

我想更好地了解如何使用 Apollo 客户端组合 GraphQL 片段。我知道该怎么做,但我想知道如何做得更好。

目前,编写我的片段涉及相当多的样板文件,特别是当我的组件只是不受影响地传递属性时。

片段声明约定?

首先,我们来看一个简单的组件:

export const User = ({
user: {
firstName,
lastName,
job,
email,
pictureUrl,
color
},
...props
}) => (
<UserWrapper {...props}>
<UserAvatarWrapper>
<Avatar
firstName={firstName}
lastName={lastName}
color={color}
src={pictureUrl}
/>
</UserAvatarWrapper>
<UserContentWrapper>
{(firstName || lastName) &&
<UserName>
{firstName}
{" "}
{lastName}
{" "}
{email && <UserEmailInline>{email}</UserEmailInline>}
</UserName>}
{job && <UserJob>{job}</UserJob>}
</UserContentWrapper>
</UserWrapper>
);
User.fragments = {
user: gql`
fragment User on User {
id
firstName
lastName
pictureUrl: avatar
job
color
email
}
`,
};

这里有一些需要做出的选择。似乎大多数示例中都使用了某种约定,但该约定在文档中并不明确。

  • User.fragments 上使用的 key 。将其命名为与组件的 propName user 完全相同是否有意义?

  • 片段的名称:按照惯例,人们似乎用组件的名称来命名它,如果有用,请在片段所在的 GraphQL 类型后加上后缀。 (这里 UserUser 后缀可能是多余的)。

我认为在同一个应用程序中遵循相同的约定是很好的,这样所有片段声明都是一致的。那么,更有经验的人可以帮我澄清这个在许多 Apollo 示例中使用的约定吗?

减少片段组合样板?

现在让我们考虑一个遵循我们设置的约定的Relationship组件。

const Relationship = ({ user1, user2 }) => (
<RelationshipContainer>
<RelationshipUserContainer>
<User user={user1} />
</RelationshipUserContainer/>
<RelationshipUserContainer>
<User user={user2} />
</RelationshipUserContainer/>
</RelationshipContainer>
);
Relationship.fragments = {
user1: gql`
fragment RelationshipUser1User on User {
...User
}
${User.fragments.user}
`,
user2: gql`
fragment RelationshipUser2User on User {
...User
}
${User.fragments.user}
`,
};

请注意,我在这里声明了 2 个看起来相同的片段。我认为这是必要的,因为有 2 个 props,并且您不必假设这两个 props 的数据要求是相同的。我们可以很容易地想象一个带有 me 属性和 friend 属性的组件,您将在其中收到 me 属性的更多数据。

这工作得很好,但是有很多看起来没有必要的样板文件和中间片段。而且它并不总是很方便,因为从组件用户的角度来看,您必须知道 2 个片段名称才能使用它。

我尝试用以下内容来简化它

Relationship.fragments = {
user1: User.fragments.user,
user2: User.fragments.user,
};

这可以工作,但如果你这样做,那么片段名称不再是RelationshipUserXUser,而是User,这意味着它破坏了封装,并且不知何故你需要注意的是,在内部,Relationship 组件正在使用 User 组件。

如果有一天,Relationship 组件切换到使用像 UserAlt 这样的替代表示形式,这将需要使用关系片段对所有组件进行重构,这就是我的做法我想避免。我认为在这种情况下,修改应该只发生在 Relationship 组件中。

结论

我想知道使用 Apollo 组合片段的最佳实践,以便组件保持真正的封装,并且最好不涉及太多样板文件。

我已经在做正确的事情了吗?

如果我真的想编写查询,所有这些样板文件是不可避免的吗?

最佳答案

这样做怎么样:

const userFragment = gql`
fragment Relationship_user on User {
...User_user
}
${User.fragments.user}
`;
Relationship.fragments = {
user1: userFragment,
user2: userFragment,
};

除此之外,我建议您如上所示调整片段名称的范围,因为需要某种名称间距,否则您更有可能会两次使用相同的片段名称。

  • User.fragments.user => User_user
  • Relationship.fragments.user => Relationship_user

关于reactjs - Apollo客户端的片段组合: convention and boilerplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45458428/

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