- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
来自函数和方法参数的 PEP 8 部分: Always use self for the first argument to instance methods. Always use cls for
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
如标题所述,驼峰式大小写(即:theQuickBrownFox)如何在其中一个单词以小写字母开头后跟大写字母(如 iPhone 中的情况)时工作。 getiPhoneNumber() 例如看起来很奇怪
我正在寻找线程安全函数的命名约定,这意味着可以从多个线程安全地调用函数。但假设我使用: void FooThreadSafe(); 在您看来,您是否认为: 此函数将使用锁定机制,并发调用是否安全? 或
我正在查看来自多个开发人员的具有多种命名约定的代码 - 一种真正的享受。其中包括匈牙利语(“s_year”、“s_day”)以及其他风格(“yearS”、“dayS”)。 有谁知道这种风格叫什么?对于
function getPerformActionFunction(someParameter) { return function() { performAction(som
我正在做一个项目,遇到了以下命名问题。 我想实现工厂模式,但我不知道要使用的最佳类命名(我正在从一个更改为另一个,这非常耗时:S)。 我通常使用命名空间来分隔类组,但我的问题在于这段特定的代码: cl
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我想知道是否有任何甜蜜的语言为“英尺”与“英寸”或“厘米”等提供某种抽象。我正在考虑在 Java 中执行以下操作: u(56).feet() + u(26).inches() 并且能够得到类似的东西
最近,我一直在阅读Code Complete,这是基于这里的许多引用以及一位 friend 的引用,并且对社区有一个命名问题。应该在确定事件是否成功的 bool 方法上使用前缀"is"吗?这是我尝试过
当项目的名称已经是复数时,你如何命名你的数组? array names 是有道理的。array collisionDatas 没那么多。 最佳答案 我几乎总是将它命名为Item name + s。命名
我正在查看代码并在函数和方法名称的开头看到 %。例如 defun %rod 和 defmethod %do-query。是否有使用这种命名方案的标准约定? 最佳答案 来自few places : %f
您对应用程序域模型类和表示层类使用的命名约定是什么?后缀/前缀来区分类的目标和第一眼: 例如,从 DAL 返回的有关人员的信息可以是 public class PersonEntity { pub
我正在为 Assemble v0.6.0 创建一个 nunjucks 插件.它似乎正在使用 Template (我认为它以前被称为 Engine ),它也支持 Verb . 我应该调用插件“engin
对于某些对象将存在于两个版本中的情况,我需要提出一个命名方案。假设服务器端有 File 和 Directory 对象,它将这些对象的轻量级版本传递给客户端。 LightweightFile 和 Lig
好的,因此您可以阅读有关标识符命名的准则,“直到您脸色发青…… Camel 案,帕斯卡案,使它们具有描述性……”但它们实际上并不能帮助您为给定名称选择最佳名称应用程序域。 最容易选择的(IMHO)是一
我见过“The Coolest Server Names”,我还见过另一个 smaller-ish question与我的有关,不幸的是,它已关闭。 不过,这是一个严肃的问题,因为我在一个内部应用程序
问题是关于命名变量或标识符的正确方法,这些标识符将两个或多个“事物”的集合分组。让我用例子和问题进一步解释一下...... 如果你拥有一个 id,你可以用标识符“id”来命名它 如果你有一个包含约会的
作为一名初学者/中级开发人员,我遇到了一个问题,因为我的项目越来越大,越来越抽象,因为我使用了更多的 OOP 原则,我在命名事物时遇到了问题。就像当我有多个项目或类库时,我不知道如何命名它们。我看到了
我正在实现一个新的Web服务,并且在我尚未使用CQRS的同时,我想创建我的服务,以便将来可以轻松地将其移至CQRS。因此,我想知道DTO类和方法的命名约定。 我已经阅读了有关DTO命名约定的blog
我是一名优秀的程序员,十分优秀!