programing

React Apollo - 여러 쿼리 만들기

fastcode 2023. 3. 31. 22:55
반응형

React Apollo - 여러 쿼리 만들기

다음과 같은 쿼리 파일이 있습니다.

import {gql} from 'react-apollo';

const queries = {
  getApps: gql`
    {
      apps {
        id
        name
      }
    }
  `,
  getSubjects: gql`
    {
      subjects {
        id
        name
      }
    }
  `
};

export default queries;

그런 다음 다음 다음 파일을 React 구성 요소로 가져옵니다.

import React, {Component} from 'react'
import queries from './queries'

class Test extends Component {
...
}

export default graphql(queries.getSubjects)(graphql(queries.getApps)(Test));

이렇게 하면 쿼리(getApp) 중 하나에 대한 데이터만 가져오고 둘 다 가져오지는 않습니다.이렇게 한 번에 하나씩 하면 다음과 같습니다.

export default graphql(queries.getSubjects)(Test);

작동하지만 다른 질문은 없습니다.네, 둘 다 따로 테스트해 봤는데 효과가 있어요.어떻게 하면 두 개의 쿼리가 모두 내 소품에 표시되도록 할 수 있을까요?

제가 선호하는 방법은compose아폴로 클라이언트(문서)의 기능.

편집: 쿼리가 여러 개 있는 경우 이름을 지정해야 합니다.

이 경우 다음과 같이 됩니다.

import React, {Component} from 'react'
import queries from './queries'
import { graphql, compose } from 'react-apollo';

class Test extends Component {
...

  render() {
    ...
    
    console.log(this.props.subjectsQuery, this.props.appsQuery); // should show both 
    
    ...
  }
}

export default compose(
   graphql(queries.getSubjects, {
      name: "subjectsQuery"
   }),
   graphql(queries.getApps, {
      name: "appsQuery"
   }),
)(Test);

이러한 쿼리를 개별적으로 재사용하지 않으려면 두 쿼리를 하나로 결합하여 단일 요청을 작성하십시오.

const combinedQueries = gql`
{
  apps {
    id
    name
  }
  subjects {
    id
    name
  }
}
`

컴포넌트에서 사용할 수 있습니다.

import React, {Component} from 'react'
import combinedQueries from './combinedQueries'

class Test extends Component {
   ...
   render() {
     ...
     if(!this.props.combinedQueries.loading) {
       console.log(this.props.combinedQueries.apps);
       console.log(this.props.combinedQueries.subjects);
     }
     ...
   }
}

export default graphql(combinedQueries, {name: 'combinedQueries'})(Test);

IMHO는 가장 깔끔한 솔루션 중 하나로, Apollo Client React 구현에 설명되어 있습니다.
기본 개념은 쿼리를 중첩된 쿼리 구성 요소로 래핑하는 것입니다.닫힘 함수를 구성 요소 하위 항목으로 사용하면 한 쿼리의 결과를 다른 쿼리로 위임하는 등의 작업을 쉽게 수행할 수 있습니다.

 const QueryOne = gql`
  query One {
    one
  }
`;

const QueryTwo = gql`
  query Two {
    two
  }
`;

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>
);

리액트-어댑트를 사용해서 만들고 있어요정말 간단해서 코드를 깨끗하게 유지할 수 있어요.

간단한 예:

import { adopt } from 'react-adopt';

...
render() {
  const Composed = adopt({
    first: ({ render }) => <Query query={FIRST_QUERY}>{ render }</Query>,
    second: ({ render }) => <Query query={SECOND_QUERY}>{ render }</Query>
  });

  return (
    <Composed>
      ({ first, second }) => {
        console.log('first', first)
        console.log('second', second)

        // validations (loading, error)

        return (
          <div>Your JSX</div>
        )
      }
    </Composed>
  )
}
...

를 사용하는 예는 많이 있습니다.

const Composed = adopt({
  first: <Query query={FIRST_QUERY} />,
  second: <Query query={SECOND_QUERY} />
});

에 주의해 주세요.<Query>컴포넌트. 자식이 필요합니다.그렇지 않으면 다음 오류가 발생합니다.

Warning: Failed prop type: The prop children is marked as required in Query, but its value is undefined.

이전 경고를 피하기 위해 가능한 해결책을 찾았습니다.

first: ({ render }) => <Query query={FIRST_QUERY}>{ render }</Query>

도움이 되길 바랍니다!

Apollo 2.x의 경우:react-adopt쿼리 및 돌연변이를 단일 레벨로 구성합니다(이 lib는 렌더링 소품(예를 들어 React Context API)을 가진 모든 컴포넌트를 구성합니다).

https://github.com/pedronauck/react-adopt

Apollo Client useQuery Hooks의 등장으로 모든 것이 바뀌었습니다.2020년 이후로는 아폴로 클라이언트 useQuery 훅을 사용하고 있을 것입니다.useQuery Hook은 두 쿼리를 모두 실행하는 횟수만큼 호출할 수 있습니다.useQuery hooks에 대한 자세한 내용은 공식 문서 https://www.apollographql.com/docs/react/data/queries/에서 확인할 수 있습니다. 저는 최근 프로젝트에서 매우 유용하다고 생각합니다.

const queries = {
  getApps: gql`
    {
      apps {
        id
        name
      }
    }
  `,

  getSubjects: gql`
    {
      subjects {
        id
        name
      }
    }
  `
};

const { loading, error, data } = useQuery(queries);

const { loading:getSubjectsLoading, error:getSubjectsError, data:getSubjects } = useQuery(getSubjects);

if (loading || getSubjectsLoading) return "Loading...";
if (error || getSubjectsError ) return <p>Error :(</p>;


console.log(data);
console.log(getSubjects);

링크에 따르면compose()하다

1 - 다음을 사용하여 "포장" 패키지 설치npm i recompose

- 사용 - Import 법 2import { compose } from "recompose";

3- 다음 형태로 사용:

export default compose(
  graphql(Query1, { alias: "Query1" }),
  graphql(Query2, { alias: "Query2" })
)(Test);

매뉴얼 : https://www.apollographql.com/docs/react/api/react-apollo/

하나의 은 '이렇게 하다'를 입니다.props★★★★★★ 。

export default compose(
  graphql(QUERY_2, {
    props: ({ data }) => ({ ...data }),
  }),
  graphql(QUERY_1, {
    props: ({ data }) => ({ ...data, myCustomAttribute: data.foo }),
  }),
)(Component);

이 방법이 제 사용 사례에 좀 더 적합하다는 것을 알게 되었습니다.

다음은 문서 링크입니다.https://www.apollographql.com/docs/react/api/react-apollo.html#graphql-config-props

아폴로에서 컴포트가 제거되었기 때문에 로다쉬라는 대체 라이브러리가 있습니다.{flowRight} 메서드는 compose와 동일한 방식으로 작동합니다.다음의 순서에 따릅니다.

  1. npm i -s lodash

  2. import {flowRight} from 'lodash'

  3. flowRight와 compose 사용법을 교환합니다.다른 모든 코드는 동일하게 동작합니다.

재귀적 반응 컴포넌트는 어떻습니까?

export const QueriesExecutor = ({
    children,
    queries,
    variables,
    loading = false,
    ...rest
}) => {
    const lastQueryIndex = queries.length - 1;

    const {data, loading: _loading} = useQuery(
        queries[lastQueryIndex].query,
        {
            variables
        }
    );

    if (queries.length > 1) {
        return (
            <QueriesExecutor
                children={children}
                queries={queries.slice(0, lastQueryIndex)}
                variables={variables}
                loading={_loading}
                {...rest}
                {...data}
            />
        );
    }

    if (loading || _loading) return 'Loading...';

    return React.Children.only(
        React.cloneElement(children, {
            ...rest,
            ...data
        })
    );
};
  • 쿼리: 병렬로 실행하는 쿼리 배열
  • 베이스 케이스: 쿼리 1개 남았습니다.아이를 렌더링해야 합니다.
  • ...rest: 이전 쿼리에서 쿼리 데이터를 수집하는 데 사용됨하위 항목에 도달할 때까지 실행자
  const { loading: cat_loading, cat_error, data: cat_data } = useQuery(categoriesAllQuery)
  const { loading: prod_loading, prod_error, data: prod_data } = useQuery(productsAllQuery)

  if (cat_loading || prod_loading) return <p>Loading ... </p>
  const { categoriesAll } = cat_data
  const { productsAll } = prod_data

언급URL : https://stackoverflow.com/questions/43380704/react-apollo-make-multiple-queries

반응형