Как использовать мутации генератора кода GraphQL в React Native?

[РЕДАКТИРОВАТЬ] См. Мой ответ ниже.

В нашем приложении, ориентированном на реакцию, мы используем Генератор кода 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 для кнопки, поддерживающей реакцию?

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
1
1
34
1

Ответы 1

Я наконец понял, как обрабатывать мутации, генерируемые Генератор кода GraphQL.

Вот как это выглядит в моем случае:

<ButtonStyle
  onPress = {() => {
    getVideoUrlMutation.then((r) => 
      OnPayment(r.data?.getIncPaymentUrl?.payment_portal_redirect_url));
  }}>
  <PayButtonStyle>pay now</PayButtonStyle>
</ButtonStyle>;

r - объект, возвращенный мутацией.

[РЕДАКТИРОВАТЬ] Я получил несколько отрицательных отзывов о своем решении выше, хотя я разговаривал с другими разработчиками реагирования, которые говорят, что то, что я сделал, - это именно то, как это должно быть сделано. "Да" намного перевешивают "нет", и это работает для меня.

очень ограниченное использование ... и похоже, что вы не понимаете управляемую данными (не основанную на событиях) природу реакции

xadm 01.04.2021 23:07

@xadm приятная критика. Хотите научить меня? Пока вы ничего не написали о моем первоначальном вопросе, который касается кода, сгенерированного GraphQL Code Generator.

David Nedrow 01.04.2021 23:10

Я предоставил ссылку на документы о мутации apollo, этого должно быть достаточно

xadm 01.04.2021 23:15

К сожалению, документы Apollo не содержат адреса кода, сгенерированного GraphQL Code Generator.

David Nedrow 01.04.2021 23:16

Я предполагаю, что использование точно такое же ... показать сгенерированный фрагмент кода?

xadm 01.04.2021 23:24

Я обновил свой исходный вопрос более подробно.

David Nedrow 02.04.2021 01:30

этот фрагмент return Apollo.useMutation< доказывает, что я прав ... и вам не нужен .call ... getVideoUrlMutation().then((r) => тоже должен работать

xadm 02.04.2021 01:48

эх, я не писал, что не может / не будет работать ... просто это не лучший способ сделать это ... stackoverflow.com/a/59472340/6124657 ... в этом случае (при перенаправлении) можно игнорировать состояния загрузки, ошибка обработка, переопределение обработчиков событий при каждом рендеринге (flaviocopes.com/react-hook-usecallback) и т. д. ... но это стоит знать fe Наличие onCompleted для более декларативного / читаемого кода stackoverflow.com/a/57733954/6124657

xadm 02.04.2021 22:22

Другие вопросы по теме

Похожие вопросы