Graphql react-apollo的动态变异文档
我需要动态更改我的突变文档,以便能够在一个突变中创建多个项目。因此,我有一个函数Graphql react-apollo的动态变异文档,graphql,react-apollo,apollo-client,Graphql,React Apollo,Apollo Client,我需要动态更改我的突变文档,以便能够在一个突变中创建多个项目。因此,我有一个函数createOrderName,它接受一个整数并能够创建正确的文档。例如,createOrderName(2)get mutation createOrderMut($input0: AddToOrderMenuItemConnectionInput!, $input1: AddToOrderMenuItemConnectionInput!) { input0: addToOrderMenuItemConnect
createOrderName
,它接受一个整数并能够创建正确的文档。例如,createOrderName(2)
get
mutation createOrderMut($input0: AddToOrderMenuItemConnectionInput!, $input1: AddToOrderMenuItemConnectionInput!) {
input0: addToOrderMenuItemConnection (input:$input0) {
changedOrderMenuItem {
id
}
}
input1: addToOrderMenuItemConnection (input:$input1) {
changedOrderMenuItem {
id
}
}
}
我的容器如下
const CartContainer = compose(
graphql(createOrderName(2), {
props: ({ mutate }) => ({
addToOrderMenuItem: (menus, orderId) => mutate({
variables: createOrdersInput(menus, orderId)
})
})
})
)(CartView)
现在,我如何将整数值传递给这个变异,以便它创建正确的变异文档?目前它被修改为2,但我需要它更灵活,以便我可以创建任意数量的项…我不确定是否可以用您当前的实现回答您的问题,因此我将敦促您重新考虑您的突变定义,并使用
GraphQList
和GraphQLInputObject
因此,根据需要变异的字段:
args: {
input: {
type: new GraphQLList(new GraphQLInputObjectType({
name: 'inputObject',
description: 'Your description here',
fields: {
id: { type: GraphQLInt }
},
})),
},
},
通过这种方式,您可以在mutate调用中提供n个对象,并获得有关您的类型的列表:
{
mutation myMutation {
addToOrderMenuItemConnection(input: [{ id: 123 }, { id: 456 }]) {
id
}
}
}
再说一次,我对您的最终目标不是100%熟悉,但我认为这将为您提供未来更改/更新的灵活性,因为您处理的是对象输入,而不是单个参数,这也(希望如此)将您与未来的破坏性更改隔离。这听起来像是您正在使用的后端的一个不幸限制。进行批处理变异的正确方法是在服务器上有一个变异字段,该字段接受包含所有要插入项的列表参数。因此,Apollo的设计不支持使用标准的
react Apollo
API生成这种动态查询。这是因为我们坚信使用静态查询比在运行时生成字段要好得多:
不过,在这种情况下,动态生成变异字符串似乎是一个不错的选择。您可以直接使用Apollo而不是通过graphql
HoC来实现这一点。您可以使用阿波罗HoC来执行以下操作:
从'react apollo'导入{withApollo};
常量MyComponent=({client})=>{
函数mutate(){
const dynamicMutationString=//在此处生成变异字符串
变异({
突变:gql`${dynamicMutationString}`,
变量:{…},
}).然后(…);
}
返回点击这里;
}
const MyComponent with Apollo=with Apollo(MyComponent);
我们构建这个额外的API就是为了这个目的——当标准的东西还不够的时候
以下是
mutate
btw:为什么不为每个订单发送一个单独的变异请求?这在时间上太昂贵了,例如,如果有一个包含500个项目的订单,需要500个网络呼叫。然而,这只需一次网络事务即可完成。我认为在这种情况下,您应该使用阿波罗来使用客户端。直接修改,并动态生成查询字符串。谢谢。我不知道有图形列表
。我会尝试一下,然后再给你回复。谢谢你的评论。这实际上是服务器端的事情。我在问客户方。我无法控制服务器端,因为我使用的是GraphQL服务。无论如何,谢谢。这是正确的答案,也许服务可以为您添加它?我知道他们会对这样的请求做出很好的响应。
import { withApollo } from 'react-apollo';
const MyComponent = ({ client }) => {
function mutate() {
const dynamicMutationString = // generate mutation string here
client.mutate({
mutation: gql`${dynamicMutationString}`,
variables: { ... },
}).then(...);
}
return <button onClick={mutate}>Click here</button>;
}
const MyComponentWithApollo = withApollo(MyComponent);