【发布时间】:2017-06-13 08:24:55
【问题描述】:
总结:我的问题是,当我使用Relay 突变创建节点时,突变会在我的数据库中创建记录,但我的客户端本地数据没有更新,并且查询响应似乎缺少新节点。
讨论:我认为RANGE_ADD 应该将新节点ListingRating 添加到我的本地ListingRatings 集合中,这应该会自动更新连接的节点(Listing 和User)。但是,根据react-dev-tools 中的relay 面板,突变不包括我需要更新的任何字段。
问题:
RANGE_ADD 在这里应该足够吗?如果是这样,我的实现有什么问题?
我必须手动更新Listing 和User 节点吗? 如果需要,怎么做?这些节点只能在突变payload 中深层嵌套使用,而FIELDS_CHANGE 需要fieldId 在payload 的顶层,对吗?
架构: 我的架构包含 Listings(广告)、Users 和 Ratings(用户对这些 Listings 的评分)。它看起来像这样:
type Listing = {
...
ratings: [ListingRating]
}
type User = {
...
ratings: [ListingRating]
}
type ListingRating = {
rating: Int
user: User
listing: Listing
}
突变:我使用 scaphold.io 作为后端,因此无法控制突变结构(尽管它们符合 Relay 规范)。它们看起来像这样:
mutation createListingRating(input: CreateListingRatingInput!) { CreateListingRatingPayload }
// CreateListingRatingInput
{
listingId: ID
listing: CreateListingInput
rating: Int
userId: ID
user: CreateUserInput
clientMutationId: ID
}
// CreateRatingPayload
{
changedListingRating: ListingRating
changedEdge: ListingRatingEdge
viewer: Viewer
clientMutationId: String
}
中继突变:
export default class CreateListingRating extends Relay.Mutation {
getMutation() {
return Relay.QL`
mutation {
createListingRating
}
`
}
getVariables() {
return {
userId: this.props.userId,
listingId: this.props.listingId,
rating: this.props.newRating,
}
}
getFatQuery() {
return Relay.QL`
fragment on CreateListingRatingPayload @relay(pattern: true){
changedEdge
changedListingRating {
listing
user
rating
}
viewer
}
`
}
getConfigs() {
return [{
type: 'RANGE_ADD',
parentID: this.props.viewer.id,
parentName: 'viewer',
connectionName: 'allListingRatings',
edgeName: 'changedEdge',
rangeBehaviors: {
'': 'append',
},
}]
}
}
查询:(不确定这是否相关)在我的应用中,我用来显示ListingRatings 的查询如下所示:
query {
getUserGroup(id: 'some-group-id') {
users {
edges {
node {
listings {
edges {
node {
ratings {
edges {
node {
rating
}
}
}
}
}
}
}
}
}
}
}
突变请求:(即在 react-dev-tools 的中继面板中显示的内容)
mutation CreateListingRating($input_0:CreateListingRatingInput!) {
createListingRating(input:$input_0) {
...F1
,
clientMutationId
}
}
fragment F0 on Viewer {
id,
user {
firstName
,
id
}
}
fragment F1 on CreateListingRatingPayload {
viewer {
...F0
}
}
【问题讨论】:
标签: reactjs graphql relayjs relay