RANGE_DELETE 和 RANGE_ADD 与参数的连接
RANGE_DELETE and RANGE_ADD on connections with arguments
我正在尝试在连接上实现 RANGE_DELETE 的突变,但仅限于指定的参数。
场景:登录用户,Viewer
可以看到其他用户的请求并批准它们。
User
类型有一个字段viewableRequests
,是一个中继连接,还有一个额外的可选参数state
,它会过滤请求,只保留与相应的状态。
架构:
type User {
id: ID
viewableRequests(first: Int, [...], state: RequestStateEnum): ViewableRequestsConnection
}
type ViewableRequestsConnection {
edges: [RequestEdge]
...
}
type RequestEdge {
cursor: GraphQLString
node: Request
}
type Request {
id: ID
user_id: Int
state: RequestStateEnum
}
enum RequestStateEnum {
pending
approved
}
因此,如果我调用 viewableRequests(state: pending)
,我只会收到处于待处理状态的请求,如果我调用 viewableRequests(state: approved)
,我只会收到处于已批准状态的请求。
我如何编写一个 ApproveRequest
突变,它将在 viewableRequests(state: pending)
连接上执行 RANGE_DELETE,并在 viewableRequests(state: approved)
连接上执行 RANGE_ADD,我应该如何塑造 getOptimisticResponse()
方法?
这是我的变异模式:
type ApproveRequestInput {
requestId: ID
}
type ApproveRequestPayload {
viewer: User
approvedRequest: Request
}
mutation {
approveRequest($input: ApproveRequestInput): ApproveRequestPayload
}
这是我当前的代码:
import Relay, {
Mutation,
} from 'react-relay';
export default class ApproveRequestMutation extends Mutation {
static fragments = {
viewer: () => Relay.QL`
fragment on User {
id
}
`,
request: () => Relay.QL`
fragment on Request {
id
}
`,
};
getMutation() {
return Relay.QL`mutation { approveRequest }`;
}
getVariables() {
return {
requestId: this.props.request.id,
};
}
getFatQuery() {
return Relay.QL`
fragment on ApproveRequestPayload @relay(pattern: true) {
viewer {
pendingRequests: viewableRequests(state: pending)
approvedRequests: viewableRequests(state: approved)
}
approvedRequest
}
`;
}
getOptimisticResponse() {
return {
// What should I write here ?
};
}
getConfigs() {
// The RANGE_DELETE config is not working ; how can I make it work ?
return [{
type: 'RANGE_DELETE',
parentName: 'viewer',
parentID: this.props.viewer.id,
connectionName: 'pendingRequests',
deletedIDFieldName: ['approvedRequest'],
pathToConnection: ['viewer', 'pendingRequests'],
}];
// How can I can add here a RANGE_ADD config for the `approvedRequests` connection ?
// I guess I must add an `approvedRequestEdge` on the mutation payload, but what is the config then ?
}
}
我有一个非常相似的设置。一位用户看到案例处于 IN_PROGRESS
状态,直到他提交。当他这样做时,我希望它从 IN_PROGRESS
移动到 WAITING
。我刚刚通过以下配置让它工作:
return [
{
type: "FIELDS_CHANGE",
fieldIDs: {
case: this.props.caseId
}
},
{
type: "RANGE_ADD",
parentName: "viewer",
parentID: this.props.viewer.__dataID__, // eslint-disable-line
connectionName: "cases",
edgeName: "case",
rangeBehaviors: {
"": "refetch",
"type(IN_PROGRESS)": "remove",
"type(WAITING)": "prepend"
}
}
];
我猜用你的 state(pending)
替换 type(IN_PROGRESS)
应该可行!
我正在尝试在连接上实现 RANGE_DELETE 的突变,但仅限于指定的参数。
场景:登录用户,Viewer
可以看到其他用户的请求并批准它们。
User
类型有一个字段viewableRequests
,是一个中继连接,还有一个额外的可选参数state
,它会过滤请求,只保留与相应的状态。
架构:
type User {
id: ID
viewableRequests(first: Int, [...], state: RequestStateEnum): ViewableRequestsConnection
}
type ViewableRequestsConnection {
edges: [RequestEdge]
...
}
type RequestEdge {
cursor: GraphQLString
node: Request
}
type Request {
id: ID
user_id: Int
state: RequestStateEnum
}
enum RequestStateEnum {
pending
approved
}
因此,如果我调用 viewableRequests(state: pending)
,我只会收到处于待处理状态的请求,如果我调用 viewableRequests(state: approved)
,我只会收到处于已批准状态的请求。
我如何编写一个 ApproveRequest
突变,它将在 viewableRequests(state: pending)
连接上执行 RANGE_DELETE,并在 viewableRequests(state: approved)
连接上执行 RANGE_ADD,我应该如何塑造 getOptimisticResponse()
方法?
这是我的变异模式:
type ApproveRequestInput {
requestId: ID
}
type ApproveRequestPayload {
viewer: User
approvedRequest: Request
}
mutation {
approveRequest($input: ApproveRequestInput): ApproveRequestPayload
}
这是我当前的代码:
import Relay, {
Mutation,
} from 'react-relay';
export default class ApproveRequestMutation extends Mutation {
static fragments = {
viewer: () => Relay.QL`
fragment on User {
id
}
`,
request: () => Relay.QL`
fragment on Request {
id
}
`,
};
getMutation() {
return Relay.QL`mutation { approveRequest }`;
}
getVariables() {
return {
requestId: this.props.request.id,
};
}
getFatQuery() {
return Relay.QL`
fragment on ApproveRequestPayload @relay(pattern: true) {
viewer {
pendingRequests: viewableRequests(state: pending)
approvedRequests: viewableRequests(state: approved)
}
approvedRequest
}
`;
}
getOptimisticResponse() {
return {
// What should I write here ?
};
}
getConfigs() {
// The RANGE_DELETE config is not working ; how can I make it work ?
return [{
type: 'RANGE_DELETE',
parentName: 'viewer',
parentID: this.props.viewer.id,
connectionName: 'pendingRequests',
deletedIDFieldName: ['approvedRequest'],
pathToConnection: ['viewer', 'pendingRequests'],
}];
// How can I can add here a RANGE_ADD config for the `approvedRequests` connection ?
// I guess I must add an `approvedRequestEdge` on the mutation payload, but what is the config then ?
}
}
我有一个非常相似的设置。一位用户看到案例处于 IN_PROGRESS
状态,直到他提交。当他这样做时,我希望它从 IN_PROGRESS
移动到 WAITING
。我刚刚通过以下配置让它工作:
return [
{
type: "FIELDS_CHANGE",
fieldIDs: {
case: this.props.caseId
}
},
{
type: "RANGE_ADD",
parentName: "viewer",
parentID: this.props.viewer.__dataID__, // eslint-disable-line
connectionName: "cases",
edgeName: "case",
rangeBehaviors: {
"": "refetch",
"type(IN_PROGRESS)": "remove",
"type(WAITING)": "prepend"
}
}
];
我猜用你的 state(pending)
替换 type(IN_PROGRESS)
应该可行!