Я бы использовал библиотеку [https://github.com/dotansimha/graphql-code-generator][1]
, тип генератора и компонент React Apollo HOC с типом, основанным на вашей схеме graphql.
После того, как вы можете сделать что-то вроде этого.
import * as React from "react";
import { Mutation } from "react-apollo";
import { gql } from "apollo-boost";
import { RouteComponentProps } from "react-router-dom";
import { LoginMutationVariables, LoginMutation } from "../../schemaTypes";
import { meQuery } from "../../graphql/queries/me";
import { userFragment } from "../../graphql/fragments/userFragment";
import { Form } from "./Form";
const loginMutation = gql`
mutation LoginMutation($email: String!, $password: String!) {
login(email: $email, password: $password) {
...UserInfo
}
}
${userFragment}
`;
export class LoginView extends React.PureComponent<RouteComponentProps<{}>> {
render() {
return (
<Mutation<LoginMutation, LoginMutationVariables>
update={(cache, { data }) => {
if (!data || !data.login) {
return;
}
cache.writeQuery({
query: meQuery,
data: { me: data.login }
});
}}
mutation={loginMutation}
>
{(mutate, { client }) => (
<Form
buttonText="login"
onSubmit={async data => {
// optional reset cache
await client.resetStore();
const response = await mutate({
variables: data
});
console.log(response);
this.props.history.push("/account");
}}
/>
)}
</Mutation>
);
}
}
Здесь LoginMutationVariables и тип LoginMutation генерируются с помощью graphql-code-generator.
graphql-code-generator
также генерирует `React Apollo Mutation / Query Hoc компонент с типом для всех мутаций и запросов. Таким образом, вам даже не нужно передавать эти типы. После генерации компонента HOC вы можете написать такой же компонент, как этот
<LoginMutationComponent>
... rest of the code
</LoginMutationComponent>
вместо того, чтобы делать это
<Mutation<LoginMutation, LoginMutationVariables>
Но вам нужно настроить graphql-code-generator. если вы хотите сгенерировать компонент HOC для запросов и мутации