在执行 Apollo 突变之前映射变量
Map variable before executing Apollo mutation
我一直在关注 this tutorial 以获得 React 应用 运行 Apollo。
现在我正处于 运行 突变的步骤中,我已经成功完成了突变,但我正在尝试执行更复杂的突变。
因此,此突变中预期的字段之一是关系字段,需要 connect 数据集,它必须类似于:
tags: {
connect: [{
id: "cjoo9e0eq004d0824nibmtzl2"
},
{
id: "cjoopece2000a0899n8jsjkr4"
},
{
id: "cjozmqfal00040878t7huvb2s"
},
{
id: "cjozmsquv000l0878y7t2zccm"
}],
},
对于这个标签字段,我在前端显示了一个 select multiselect,因此该值将是一个 ID 数组:["cjoo9e0eq004d0824nibmtzl2","cjoopece2000a0899n8jsjkr4"...].
由于突变期望该字段是具有 id 的对象数组,我试图以某种方式映射该字符串以将其转换为预期格式,但我没有任何运气。我不知道在执行突变之前我可以在哪里转换该变量。
看来是个棘手的问题,希望解释清楚。
非常感谢任何帮助!
编辑以添加一些代码:
const CREATE_VIDEO_MUTATION = gql`
mutation CreateVideoMutation($title: String!, $tags: [TagWhereUniqueInput!]) {
createVideo(
data: {
title: $title,
tags: {
connect: $tags
}
}
) {
id
title
}
}
`
class CreateVideo extends Component {
state = {
title: '',
tags: [],
}
render() {
const { title, tags } = this.state;
return (
.....
<select multiple
className="mb2"
value={tags}
onChange={e => {
this.setState({ tags: [...e.target.options]
.filter(({selected}) => selected)
.map(({value}) => value) })
}}>
{tagsToRender.map(tag => {
return (
<option key={tag.id} value={tag.id}>
{tag.name}
</option>
)
})}
</select>
<Mutation
mutation={CREATE_VIDEO_MUTATION}
variables={{ title, tags }}
onCompleted={() => this.props.history.push('/')}>
{createVideoMutation => <button onClick={createVideoMutation}>Submit</button>}
</Mutation>
下面应该做的。
const _tags = tags.map(tag => ({id}))
<Mutation
mutation={CREATE_VIDEO_MUTATION}
variables={{ title, tags: _tags }}
onCompleted={() => this.props.history.push('/')}>
{createVideoMutation => <button onClick={createVideoMutation}>Submit</button>}
</Mutation>
我一直在关注 this tutorial 以获得 React 应用 运行 Apollo。
现在我正处于 运行 突变的步骤中,我已经成功完成了突变,但我正在尝试执行更复杂的突变。
因此,此突变中预期的字段之一是关系字段,需要 connect 数据集,它必须类似于:
tags: {
connect: [{
id: "cjoo9e0eq004d0824nibmtzl2"
},
{
id: "cjoopece2000a0899n8jsjkr4"
},
{
id: "cjozmqfal00040878t7huvb2s"
},
{
id: "cjozmsquv000l0878y7t2zccm"
}],
},
对于这个标签字段,我在前端显示了一个 select multiselect,因此该值将是一个 ID 数组:["cjoo9e0eq004d0824nibmtzl2","cjoopece2000a0899n8jsjkr4"...].
由于突变期望该字段是具有 id 的对象数组,我试图以某种方式映射该字符串以将其转换为预期格式,但我没有任何运气。我不知道在执行突变之前我可以在哪里转换该变量。
看来是个棘手的问题,希望解释清楚。
非常感谢任何帮助!
编辑以添加一些代码:
const CREATE_VIDEO_MUTATION = gql`
mutation CreateVideoMutation($title: String!, $tags: [TagWhereUniqueInput!]) {
createVideo(
data: {
title: $title,
tags: {
connect: $tags
}
}
) {
id
title
}
}
`
class CreateVideo extends Component {
state = {
title: '',
tags: [],
}
render() {
const { title, tags } = this.state;
return (
.....
<select multiple
className="mb2"
value={tags}
onChange={e => {
this.setState({ tags: [...e.target.options]
.filter(({selected}) => selected)
.map(({value}) => value) })
}}>
{tagsToRender.map(tag => {
return (
<option key={tag.id} value={tag.id}>
{tag.name}
</option>
)
})}
</select>
<Mutation
mutation={CREATE_VIDEO_MUTATION}
variables={{ title, tags }}
onCompleted={() => this.props.history.push('/')}>
{createVideoMutation => <button onClick={createVideoMutation}>Submit</button>}
</Mutation>
下面应该做的。
const _tags = tags.map(tag => ({id}))
<Mutation
mutation={CREATE_VIDEO_MUTATION}
variables={{ title, tags: _tags }}
onCompleted={() => this.props.history.push('/')}>
{createVideoMutation => <button onClick={createVideoMutation}>Submit</button>}
</Mutation>