Множественные запросы / мутации в Apollo 2.1

Мне нужна помощь в использовании нового компонента запросов и мутаций в Apollo 2.1, особенно с несколькими запросами и мутациями.

У меня следующие проблемы:

  1. У меня есть запрос graphql, который зависит от предыдущего результата graphql, как я могу с этим справиться?
  2. Как мне добавить две разные мутации (в моем компоненте мне нужно выполнить два разных действия) в компонент, у которого уже есть запрос?
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
16
0
20 942
6

Ответы 6

По моему мнению,

  1. Чтобы запрос зависел от предыдущего запроса, вы можете разбить этот запрос на дочерний компонент и передать ему результат предыдущего запроса, например props, и выполнить этот запрос.
  2. Чтобы использовать более одной мутации и запросов, вы можете использовать compose следующим образом

    ...
    @compose(
     graphql(GET_FEEDS_QUERY, {name : 'getFeeds'}),
     graphql(CREATE_NEW_POST, {name: "createNewPost"}),
     graphql(LIKE_POST_MUTATION, { name: "unlikePostMutation"}),
     ...
    )
    class HomeScreen extends Component {
     ...
    }
    

изменить 2019/08/24 с Аполлона документы:

The new hooks API for Apollo Client is a simpler way to fetch data in your React app without the boilerplate of render prop components and higher-order components (HOC). We recommend using hooks for all new Apollo code going forward.

оригинальный ответ: Вы должны их вить. См. Этот пример:

const NumbersWithData = () => (
  <Query query = {QueryOne}>
    {({ loading: loadingOne, data: { one } }) => (
      <Query query = {QueryTwo}>
        {({ loading: loadingTwo, data: { two }}) => {
          if (loadingOne || loadingTwo) return <span>loading...</span>
          return <h3>{one} is less than {two}</h3>
        }}
      </Query>
    )}
  </Query>
);

Чтобы упростить управление вложением, вы можете проверить реагировать-усыновлять. У них есть пример приложения Apollo ToDo, в котором они сочетают запрос и несколько мутаций.

@brunodahora, круто - если вы считаете, что это ответ на ваш вопрос, пожалуйста, не забудьте нажать на кнопку "Принять"

devboell 12.04.2018 14:53

Мне не очень нравится идея гнездования. Что, если у меня есть панель с 20 мутациями?

Victor L. 02.05.2018 06:57

Тогда вы не разработчик React и вам следует разбить все на несколько компонентов.

Jamie Hutber 04.03.2019 15:15

@JamieHutber - сильное заявление, но я согласен в принципе. Если у вас есть один компонент, необходимый для выполнения нескольких запросов / мутаций, вероятно, это запах кода, и вам следует по возможности разбить свое приложение на несколько отдельных компонентов.

kekko12 19.03.2019 16:26

Я просто перечитал это, у меня там получилось довольно тяжело ... Интересно, почему. lol Но да, я тоже согласен с этим в целом.

Jamie Hutber 19.03.2019 17:44

Ссылка в первом предложении мертва. Кто-нибудь знает, где это задокументировано? Изменилось ли что-нибудь из этого с апреля 2018 года?

ox. 16.08.2019 13:58

@ox, страницу я тоже не нашел, поэтому удалил ссылку.

devboell 19.08.2019 10:07

Я написал Средний пост о том, как объединить мутацию и запрос в одном компоненте. Вот отрывок из сообщения

// other import
import {Query} from “Apollo-graphql”; // new Query Component
import gql from "graphql-tag";
import { graphql } from "react-apollo";
import UserComponent from '../component/UserComponent'; // any component to display query result
const GET_ALL_USER = gql`
    {
        allUsers: {
            firstname,
            lastname,
            username,
            # other information
        }
    }
`
const UPDATE_USER_STATUS = gql`
    mutation UpdateUserStatus($userID: ID!, $status: Int!){
        updateUserState(userID: $userID, status: $status){
            firstname,
            lastname
            username
            # other information
        }
    }
`
ExampleComponent extends React.Component{
    onEditInformation = async (user) => {
        const response  = await mutate({
            variables: {userID: user}
        })
    }
render(){
        return(
            <Query query = {GET_ALL_USER}>
                {({data: { allUsers }}) => {
                    return allusers.map(user => {
                        return (
                            <UserComponent
                                user = {user}
                                onEdit = {() => this.onEditInformation(user)}
                            />
                        )
                    })
                }}
            </Query>
        )
    }
}
export default graphql(UPDATE_USER_STATUS)(ExampleComponent);

Для этого react-apollo экспортирует функцию compose. Используя эту функцию, вы можете одновременно использовать сразу несколько усилителей компонентов. Включая несколько расширений graphql () или даже Redux connect ().

import { Mutation, compose, graphql } from "react-apollo";

class AddTweet extends Component {
....
....
....
}
export default compose(
  graphql(GET_AUTHORS, { name: "getAuthors" }),
  graphql(ADD_TWEET, { name: "addTweet" }),
  connect(...), // incase you are using Redux
)(AddTweet);

Важное замечание: compose() сначала выполняет последний энхансер и прокладывает себе путь назад по списку энхансеров.

Еще одна вещь: вы использовали this.props.data, теперь вы получите undefined. просто console.info(this.props), и вы увидите, что сейчас происходит с реквизитом. Теперь у вас будет два свойства: getAuthors и addTweet. Итак, теперь это будет this.props.name-in-compose.name-of-type-in-typeDefs, то есть this.props.getAuthors.getUsers. Мне потребовалось немного времени, чтобы понять это.

Могу я спросить, где в этом примере используется Mutation?

Jamie Hutber 04.03.2019 15:11

Очень плохо использовать Redux с apollo.

Alex Shwarc 19.10.2019 13:02

Помимо использования compose из react-apollo, вы можете попробовать еще одну отличную библиотеку утилит - реагировать-усыновлять. Отличная небольшая служебная библиотека, которая помогает вам составлять компоненты типа несколькоrender props, чтобы у вас не было вложенных шаблонов ада.

Я написал аналогичный ответ, который в основном покрывает все ваши текущие потребности с точки зрения:

  • Как использовать предыдущий результат от вашего картографа fn с помощью react-accept
  • Объедините несколько запросов / мутаций из составного компонента с помощью реакции-принятия

Вот подробный ответ, который вы ищете и, надеюсь, может помочь в решении ваших проблем :)

@brunodahora, если вы все еще ищете решение для react-adopt, проверить это здесь :)

JayKan 13.06.2019 11:08

Лучшее решение для этого

Просто вложите функцию graphql

export default graphql(addBookMutation)(graphql(getAuthorsQuery)(AddBook))

Вы можете сослаться на это

Концепции Аполлона

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