【发布时间】:2019-05-31 21:44:59
【问题描述】:
我正在使用 React 和 Apollo 客户端从 GraphQL 服务器获取数据。
现在我在反应中编写了以下组件。
- 列出所有项目的组件 - 工作。
- 用于创建项目的组件 - 工作。
- 用于更新项目的组件 - 不工作(不知道如何做到这一点)。
我有 2 个组件文件。
- 更新Audio.js。
- AudioForm.js。
现在。
- 我需要从 GraphQL 服务器获取给定 audioID 的数据(将从路径参数获取)。
- 然后将该音频设置为状态。
- 并将音频状态传递给 AudioForm 组件。
我正在初始化带有空白字段的音频,最初处于状态。
我可以使用 Query 获取数据,但我不确定如何更新将传递给 AudioForm 并进一步填充数据的音频状态。
UpdateAudio.js
import React, { Component, Fragment } from 'react';
import { withRouter } from 'react-router-dom';
import { Mutation, Query, graphql } from 'react-apollo';
import { UpdateAudioQuery, GetAudio } from '../query';
import { Button, Grid, LinearProgress } from '@material-ui/core';
import AudioForm from '../components/AudioForm';
class UpdateAudio extends Component {
constructor(props) {
super(props);
this.state = {
site: "5d517862-0630-431c-94b1-bf34de6bfd8b",
audio: {
site: "5d517862-0630-431c-94b1-bf34de6bfd8b",
title: '',
description: '',
}
};
this.updateCache = this.updateCache.bind(this);
this.handleChange = this.handleChange.bind(this);
}
updateCache = (cache, { data }) => {
if (data.createAudio.audio.guid) {
console.log("redirecting...")
this.props.history.push('/audios')
}
}
handleChange = event => {
const { name, value } = event.target;
this.setState(prevState => ({
audio: {
...prevState['audio'],
[name]: value,
}
}));
};
render() {
return (
<Fragment>
<AudioForm audio={this.state.audio} handleChange={this.handleChange} />
<Grid container alignItems="center" justify="center">
<Grid item>
<Mutation mutation={UpdateAudioQuery} update={this.updateCache}>
{(Update, {loading, data, error}) => {
if (loading) {
return <Button variant="contained" size="large" color="secondary" disabled>Save</Button>
}
else if (error) {
return <div>{error}</div>
}
else {
return <Button variant="contained" size="large" color="secondary" onClick={() => Update({variables: this.state.audio})}>Update</Button>
}
}}
</Mutation>
</Grid>
</Grid>
</Fragment>
)
}
}
UpdateAudio = withRouter(UpdateAudio)
export default graphql(GetAudio,
{
name:'Get',
options: ownProps => ({ variables: {site: "5d517862-0630-431c-94b1-bf34de6bfd8b", guid: ownProps.match.params.guid} })
})(UpdateAudio);
AudioForm.js
import React, {Fragment} from 'react';
import { TextField, Grid } from '@material-ui/core';
class AudioForm extends React.Component {
render() {
console.log(this.props.audio.title);
return (
<Fragment>
<form noValidate autoComplete="off">
<Grid container spacing={24} alignItems="center" justify="center">
<Grid item md={4} xs={12}>
<TextField
id="audio-title"
name="title"
label="Title"
margin="normal"
variant="outlined"
InputLabelProps={{ shrink: true }}
fullWidth
defaultValue={this.props.audio.title}
onChange={this.props.handleChange}
required
/>
</Grid>
<Grid item md={4} xs={12}>
<TextField
id="audio-description"
name="description"
label="Description"
margin="normal"
variant="outlined"
InputLabelProps={{ shrink: true }}
fullWidth
defaultValue={this.props.audio.description}
onChange={this.props.handleChange}
/>
</Grid>
</Grid>
</form>
</Fragment>
);
}
}
export default AudioForm;
query.js
import gql from 'graphql-tag';
export const GetAudio = gql`
query Get($site: String!, $guid: String!) {
getAudio(site: $site, guid: $guid){
guid
siteGuid
title
description
}
}`
export const UpdateAudio = gql`
mutation Update($site: String!, $guid: String!, $title: String, $description: String) {
updateAudio(
input:{
guid: $guid,
site: $site,
title: $title,
description: $description
}
) {
audio{
guid
siteGuid
title
status
}
}
}`;
【问题讨论】:
-
您可以通过 GraphQl 游乐场进行更新吗?它会抛出错误吗?
-
是的,更新适用于 GraphQL 游乐场。我没有遇到graphql的问题。问题是我如何获取现有 ID 的数据并在 react 中填写表单,然后将更新的内容发回。
标签: reactjs graphql apollo-client