iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

挑戰typescript+react+golang+graphql系列 第 15

Day15.Apollo Client demo

  • 分享至 

  • xImage
  •  

在terminal輸入以下指令

user@userdeMacBook-Pro WebstormProjects % npx create-react-app apollo_client_demo
user@userdeMacBook-Pro WebstormProjects % cd apollo_client_demo
user@userdeMacBook-Pro apollo_client_demo % npm install @apollo/client graphql

套件都安裝好後先執行

npm start

在瀏覽器上輸入localhost:3000
看看是否有看到以下畫面,如果有的話就代表專案創建成功
https://ithelp.ithome.com.tw/upload/images/20220929/20150497P6mAyir4b8.png

首先修改index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import {ApolloClient, ApolloProvider, gql, InMemoryCache} from "@apollo/client";

// 設定Apollo client的連線
// uri 指定我們的 GraphQL 服務器的 URL。
// cache 是 InMemoryCache 的一個實例,Apollo Client 在獲取查詢結果後使用它來緩存查詢結果。

const client = new ApolloClient({
    uri: 'https://flyby-gateway.herokuapp.com/',
    cache: new InMemoryCache(),
});

// 用graphql的query取資料
client
.query({
    query: gql`
        query GetLocations {
            locations {
                id
                name
                description
                photo
            }
        }
    `,
})
.then((result) => console.log(result));

// Supported in React 18+
const root = ReactDOM.createRoot(document.getElementById('root'));


// 使用 ApolloProvider 組件將 Apollo Client 連接到 React。 與 React 的 Context.Provider 類似,ApolloProvider 包裝您的 React 應用程序並將 Apollo Client 放置在上下文中,使您可以從組件樹中的任何位置訪問它。
root.render(
    <ApolloProvider client={client}>
        <App/>
    </ApolloProvider>,
);

回到瀏覽器打開F12看看console有沒有取得object
https://ithelp.ithome.com.tw/upload/images/20220929/20150497AYsq8gmUeH.png

接著到app.js修改如下

// Import everything needed to use the `useQuery` hook
import { useQuery, gql } from '@apollo/client';

const GET_LOCATIONS = gql`
  query GetLocations {
    locations {
      id
      name
      description
      photo
    }
  }
`;

function DisplayLocations() {
  const { loading, error, data } = useQuery(GET_LOCATIONS);

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error :(</p>;

  return data.locations.map(({ id, name, description, photo }) => (
      <div key={id}>
        <h3>{name}</h3>
        <img width="400" height="250" alt="location-reference" src={`${photo}`} />
        <br />
        <b>About this location:</b>
        <p>{description}</p>
        <br />
      </div>
  ));
}

export default function App() {
    return (
        <div>
            <h2>My first Apollo app ?</h2>
            <br/>
            <DisplayLocations />
        </div>
    );
}

我們在DisplayLocations()裡面使用了useQuery hook
每當component render時,useQuery hook 會自動執行我們的查詢並返回一個包含loading、error和數據屬性的結果:
Apollo Client 自動跟踪查詢的loading、error狀態,這些狀態反映在loading和error屬性中。
當您的查詢結果返回時,它會附加到 data 屬性。

回到localhost:3000看看畫面是否有顯示成功
https://ithelp.ithome.com.tw/upload/images/20220929/20150497KjyHmQFx0S.png

今天就先到這邊


上一篇
Day14.Apollo client
下一篇
Day16 Graphql subscription
系列文
挑戰typescript+react+golang+graphql18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言