GraphQL & Apollo
GraphQL
REST APIの限界
APIから受信したデータは,特定の情報のみが必要であるが,すべて受信しなければならない.
1つのAPIに必要な情報がない場合は、2つのリクエストを同時に受信する必要があります.
GraphQLによるデータ交換
リクエスト(query)
query {
teams {
id
manager
office
extension_number
mascot
cleaning_duty
project
}
}
query {
teams {
manager
office
}
}
query {
team(id: 1) {
manager
office
}
}
query {
team(id: 1) {
manager
office
members {
first_name
last_name
}
}
}
query {
teams {
manager
office
mascot
}
roles {
id
requirement
}
}
追加、変更、削除(変異)
mutation {
// 추가 : postTeam
// 수정 : editTeam
// 삭제 : deleteTeam
postTeam (input: {
manager: "John Smith"
office: "104B"
extension_number: "#9982"
mascot: "Dragon"
cleaning_duty: "Monday"
project: "Lordaeron"
}) {
manager
office
extension_number
mascot
cleaning_duty
project
}
}
GraphQLのメリット
オーバーホールの問題を解消し、データ転送量
未キャプチャの問題を解決し、要求を減らす
1つのURIからすべてのリクエストを要求できます.
Apollo
その他のソリューションの表示>
特長
Apolloクライアントの使用
npm install @apollo/client graphql
// ...
import { ApolloProvider } from '@apollo/client';
import { ApolloClient, InMemoryCache } from '@apollo/client'
// ...
// app.js
// ...
const client = new ApolloClient({
uri: 'http://localhost:4000',
cache: new InMemoryCache()
});
// ...
return (
<div className="App">
<ApolloProvider client={client}>
<header className="App-header">
<h1>Company Management</h1>
<nav>
<ul>
{NavMenus()}
</ul>
</nav>
</header>
<main>
{mainComp[menu]}
</main>
</ApolloProvider>
</div>
);
// ...
ApolloClient
REST APIのaxiosのような役割は,対応するuriと通信できる.
ApolloProvider
内部要素を囲むことで、内部要素はApolloクライアントを介してサーバと通信することができます.
サーバからのデータの取得
リクエスト・オブジェクトの作成
// ...
const GET_ROLES = gql`
query GetRoles {
roles {
id
}
}
`;
// ...
リクエスト・オブジェクトを使用したデータの受信// ...
function AsideItems () {
const { loading, error, data } = useQuery(GET_ROLES);
if (loading) return <p className="loading">Loading...</p>
if (error) return <p className="error">Error :(</p>
//...
}
// ...
データの削除
// ...
// delete 요청 변수
const DELETE_TEAM = gql`
mutation DeleteTeam($id: ID!) {
deleteTeam(id: $id) {
id
}
}
`
// ...
function execDeleteTeam () {
if (window.confirm('이 항목을 삭제하시겠습니까?')) {
// 함수 실행
deleteTeam({variables: {id: contentId}})
}
}
const [deleteTeam] = useMutation(
//요청 변수가 실행되고 이의 결과로 onCompleted가 실행
DELETE_TEAM, { onCompleted: deleteTeamCompleted })
//onCompleted의 실행 함수
function deleteTeamCompleted (data) {
console.log(data.deleteTeam)
alert(`${data.deleteTeam.id} 항목이 삭제되었습니다.`)
setContentId(0)
}
// ...
☝🏻 データが削除された場合、リストをリフレッシュする必要がありますか?const { loading, error, data, refetch } = useQuery(GET_TEMAS)
// ...
let refetchTeams
// ...
const { loading, error, data, refetch } = useQuery(GET_TEMAS)
refetchTeams = refetch
// ...
function deleteTeamCompleted (data) {
// ...
alert(`${data.deleteTeam.id} 항목이 삭제되었습니다.`)
refetchTeams()
}
// ...
変更と追加も同じ構造で行います.Fragment
繰り返し使用する要素をパーティションに分離
const Names = gql`
fragment names on People {
first_name
last_name
}
`
const HealthInfo = gql`
fragment healthInfo on People {
sex
blood_type
}
`
const WorkInfo = gql`
fragment workInfo on People {
serve_years
role
team
from
}
`
クエリーに適用const GET_PEOPLE = gql`
query GetPeople {
people {
id
...names
...healthInfo
}
}
${Names}
${HealthInfo}
`;
ヤルコのYouTube講座を見て書いたものですヤルコ講座へ向かいます>
Reference
この問題について(GraphQL & Apollo), 我々は、より多くの情報をここで見つけました https://velog.io/@skdud4659/GraphQL-Apolloテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol