В нашем приложении, ориентированном на реакцию, мы используем Генератор кода GraphQL (GCG) для генерации запросов GraphQL и мутаций из нашей схемы и локальных файлов GraphQL. Ниже находится раздел генерирует нашего файла codegen.yml.
generates:
src/generated/graphql.tsx:
plugins:
- "typescript"
- "typescript-operations"
- "typescript-react-apollo"
config:
withResultType: true
withHOC: false
withHooks: true
withComponent: false
withMutationFn: false
./graphql.schema.json:
plugins:
- "introspection"
Запросы очень просты в том, как они вызываются и как осуществляется доступ к данным.
Однако мутации стали для нас препятствием.
Вот файл graphql, который обрабатывает генератор кода GraphQL:
mutation GetPaymentUrl(
$account_number: String!
$role: String!
$pay_my_bill: Boolean
$mortgageeBillIndicator: Boolean
$requested_by: String!
) {
getIncPaymentUrl(
input: {
account_number: $account_number
role: $role
pay_my_bill: $pay_my_bill
mortgageeBillIndicator: $mortgageeBillIndicator
requested_by: $requested_by
}
) {
account_number
payment_portal_redirect_url
}
}
Вот код, сгенерированный GCG:
export type Mutation = {
__typename?: 'Mutation';
getIncPaymentUrl?: Maybe<IncResponse>;
};
export type MutationGetIncPaymentUrlArgs = {
input?: Maybe<IncPaymentRequestUrl>;
};
export type IncPaymentRequestUrl = {
account_number: Scalars['String'];
role: Scalars['String'];
pay_my_bill?: Maybe<Scalars['Boolean']>;
mortgageeBillIndicator?: Maybe<Scalars['Boolean']>;
requested_by: Scalars['String'];
};
export type IncResponse = {
__typename?: 'IncResponse';
account_number?: Maybe<Scalars['String']>;
payment_portal_redirect_url?: Maybe<Scalars['String']>;
};
export type GetPaymentUrlMutationVariables = Exact<{
account_number: Scalars['String'];
role: Scalars['String'];
pay_my_bill?: Maybe<Scalars['Boolean']>;
mortgageeBillIndicator?: Maybe<Scalars['Boolean']>;
requested_by: Scalars['String'];
}>;
export type GetPaymentUrlMutation = {__typename?: 'Mutation'} & {
getIncPaymentUrl?: Maybe<
{__typename?: 'IncResponse'} & Pick<
IncResponse,
'account_number' | 'payment_portal_redirect_url'
>
>;
};
export const GetPaymentUrlDocument = gql`
mutation GetPaymentUrl(
$account_number: String!
$role: String!
$pay_my_bill: Boolean
$mortgageeBillIndicator: Boolean
$requested_by: String!
) {
getIncPaymentUrl(
input: {
account_number: $account_number
role: $role
pay_my_bill: $pay_my_bill
mortgageeBillIndicator: $mortgageeBillIndicator
requested_by: $requested_by
}
) {
account_number
payment_portal_redirect_url
}
}
`;
/**
* __useGetPaymentUrlMutation__
*
* To run a mutation, you first call `useGetPaymentUrlMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useGetPaymentUrlMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [getPaymentUrlMutation, { data, loading, error }] = useGetPaymentUrlMutation({
* variables: {
* account_number: // value for 'account_number'
* role: // value for 'role'
* pay_my_bill: // value for 'pay_my_bill'
* mortgageeBillIndicator: // value for 'mortgageeBillIndicator'
* requested_by: // value for 'requested_by'
* },
* });
*/
export function useGetPaymentUrlMutation(
baseOptions?: Apollo.MutationHookOptions<
GetPaymentUrlMutation,
GetPaymentUrlMutationVariables
>,
) {
return Apollo.useMutation<
GetPaymentUrlMutation,
GetPaymentUrlMutationVariables
>(GetPaymentUrlDocument, baseOptions);
}
export type GetPaymentUrlMutationHookResult = ReturnType<
typeof useGetPaymentUrlMutation
>;
export type GetPaymentUrlMutationResult = Apollo.MutationResult<GetPaymentUrlMutation>;
export type GetPaymentUrlMutationOptions = Apollo.BaseMutationOptions<
GetPaymentUrlMutation,
GetPaymentUrlMutationVariables
>;
Когда я исследую getPaymentUrlMutation из приведенного выше примера, я не вижу функции мутировать, задокументированной в сгенерированном коде. Я вижу методы "call", "apply" и "bind".
Я не понимаю, где и как назвать эту мутацию.
Я обнаружил, что если я вызываю getPaymentUrlMutation.call({}) перед возвратом в моем tsx-файле, я получаю бесконечный цикл запросов.
Если в ответ я назову это так ...
<ButtonStyle
onPress = {() => {
getPaymentUrlMutation.call({}).then((r) =>
OnPayment(
r.data?.getIncPaymentUrl?.payment_portal_redirect_url,
),
);
}}>
<PayButtonStyle>pay now</PayButtonStyle>
</ButtonStyle>
... У меня нет возможности обрабатывать ошибки. Кроме того, как отмечает @xadm, это не кажется «правильным» с точки зрения реакции.
Как мне выполнить мутацию в контексте события onPress для кнопки, поддерживающей реакцию?





Я наконец понял, как обрабатывать мутации, генерируемые Генератор кода GraphQL.
Вот как это выглядит в моем случае:
<ButtonStyle
onPress = {() => {
getVideoUrlMutation.then((r) =>
OnPayment(r.data?.getIncPaymentUrl?.payment_portal_redirect_url));
}}>
<PayButtonStyle>pay now</PayButtonStyle>
</ButtonStyle>;
r - объект, возвращенный мутацией.
[РЕДАКТИРОВАТЬ] Я получил несколько отрицательных отзывов о своем решении выше, хотя я разговаривал с другими разработчиками реагирования, которые говорят, что то, что я сделал, - это именно то, как это должно быть сделано. "Да" намного перевешивают "нет", и это работает для меня.
очень ограниченное использование ... и похоже, что вы не понимаете управляемую данными (не основанную на событиях) природу реакции
@xadm приятная критика. Хотите научить меня? Пока вы ничего не написали о моем первоначальном вопросе, который касается кода, сгенерированного GraphQL Code Generator.
Я предоставил ссылку на документы о мутации apollo, этого должно быть достаточно
К сожалению, документы Apollo не содержат адреса кода, сгенерированного GraphQL Code Generator.
Я предполагаю, что использование точно такое же ... показать сгенерированный фрагмент кода?
Я обновил свой исходный вопрос более подробно.
этот фрагмент return Apollo.useMutation< доказывает, что я прав ... и вам не нужен .call ... getVideoUrlMutation().then((r) => тоже должен работать
эх, я не писал, что не может / не будет работать ... просто это не лучший способ сделать это ... stackoverflow.com/a/59472340/6124657 ... в этом случае (при перенаправлении) можно игнорировать состояния загрузки, ошибка обработка, переопределение обработчиков событий при каждом рендеринге (flaviocopes.com/react-hook-usecallback) и т. д. ... но это стоит знать fe Наличие onCompleted для более декларативного / читаемого кода stackoverflow.com/a/57733954/6124657