成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

全棧 React + GraphQL 教程(一)

luxixing / 3099人閱讀

摘要:然而,盡管使用有諸多好處,但邁出第一步可能并不容易。為了簡(jiǎn)化初始教程,我們今天只構(gòu)建一個(gè)簡(jiǎn)單的列表視圖。是我們將在本教程系列中使用的客戶端的名稱。我們將列表組件命名為。在本教程的其余部分中,你將了解到我們構(gòu)建一個(gè)真正的通信應(yīng)用的基礎(chǔ)。

首發(fā)于眾成翻譯

Part 1——前端:使用 Apollo 聲明式地請(qǐng)求和 mock 數(shù)據(jù)

GraphQL 是一種新的 API 定義和查詢語(yǔ)言,有可能成為新的 REST。它使 UI 組件易于聲明式地獲取數(shù)據(jù),而不必關(guān)注后端實(shí)現(xiàn)細(xì)節(jié)。GraphQL 作為一種強(qiáng)大的抽象,可以加快應(yīng)用開發(fā)速度,使代碼更容易維護(hù)。

然而,盡管使用 GraphQL 有諸多好處,但邁出第一步可能并不容易。這就是為什么我編寫了這一系列教程,帶你一步步地編寫一個(gè)包含 GraphQL 和 Apollo Client 的全棧 React 應(yīng)用。該系列將引導(dǎo)你完整構(gòu)建一個(gè)使用 GraphQL 的即時(shí)消息應(yīng)用:

Part 1(本文):設(shè)置一個(gè)簡(jiǎn)單的客戶端

Part 2:設(shè)置一個(gè)簡(jiǎn)單的服務(wù)器

Part 3:編寫變更并保持客戶端同步

Part 4:積極 UI 和客戶端 store 更新

Part 5:輸入類型和自定義緩存解析器

Part 6:服務(wù)器端的訂閱

Part 7:客戶端的 GraphQL 訂閱

本教程——作為這一系列中的第一篇——是關(guān)于如何在前端開始使用 GraphQL。只需要大約20-30分鐘,最終你會(huì)得到一個(gè)非常簡(jiǎn)單的 React UI,它使用 GraphQL 加載數(shù)據(jù),看起來(lái)像這樣:

一個(gè)使用 GraphQL 加載數(shù)據(jù)的簡(jiǎn)易 React UI

讓我們開始吧!

1. 環(huán)境搭建

注意:要完成此教程,你需要在你的機(jī)器上安裝 node,npm 和 git,并且對(duì) React 有所了解。

我們將在本教程中使用 create-react-app,所以執(zhí)行安裝:

> npm install -g create-react-app

我們還需要從 GitHub 中克隆本教程的代碼庫(kù),其中包含了我們稍后會(huì)使用到的 CSS 和圖像。

> git clone https://github.com/apollographql/graphql-tutorial.git
> cd graphql-tutorial

接下來(lái),我們使用 create-react-app 創(chuàng)建我們的 react 應(yīng)用。

> create-react-app client
> cd client

為了確保它能工作,我們啟動(dòng)服務(wù)器:

> npm start

如果一切正常,你現(xiàn)在應(yīng)該在瀏覽器中看到如下內(nèi)容:

2. 編寫第一個(gè)組件

由于我們正在使用 Apollo 構(gòu)建一個(gè)應(yīng)用,所以我們通過(guò)從 ../ resources 復(fù)制 logo.svgApp.css 來(lái)修改 logo 和 CSS。

> cd src
> cp ../../resources/* .

為了簡(jiǎn)化初始教程,我們今天只構(gòu)建一個(gè)簡(jiǎn)單的列表視圖。讓我們修改 App.js 中的代碼:

修改 “Welcome to React” 為 “Welcome to Apollo”。Apollo 是我們將在本教程系列中使用的 GraphQL 客戶端的名稱。

刪除 “To get started ..”段落,并用純 React 組件替換它,該組件將渲染一個(gè)具有兩個(gè)列表項(xiàng)的無(wú)序列表,“Channel 1”和 “Channel 2”(是的,你猜到了,我們要構(gòu)建一個(gè)通信應(yīng)用!)。我們將列表組件命名為 ChannelsList。

現(xiàn)在你的 App.js 應(yīng)該如下所示:

import React, { Component } from "react";
import logo from "./logo.svg";
import "./App.css";
const ChannelsList = () =>
     (
  • Channel 1
  • Channel 2
);
class App extends Component {
   render() {
     return (
       

Welcome to Apollo

); } }
export default App;

create-react-app 為你設(shè)置好了熱加載,所以一旦你保存文件,你的應(yīng)用所在的瀏覽器窗口將會(huì)更新以反映更改:

如果看起來(lái)像這樣,你的設(shè)置就是正確的。

3. 編寫你的 GraphQL schema

現(xiàn)在我們有一個(gè)簡(jiǎn)單的應(yīng)用正在運(yùn)行,現(xiàn)在是為它編寫 GraphQL 類型定義的時(shí)候了。 Schema 將指定我們的應(yīng)用中存在哪些對(duì)象類型,以及它們有哪些字段。此外,它指定了我們的 API 的入口。我們新建一個(gè)名為 schema.js 的文件:

export const typeDefs = `
type Channel {
   id: ID!                # "!" 為必填
   name: String
}
# 此類型指定了我們的 API 的入口點(diǎn)。在本例中,只有一個(gè)——"channels"——返回頻道列表。
type Query {
   channels: [Channel]    # "[]" 意味著這是頻道列表
}
`;

有了這個(gè) schema,我們可以在下節(jié)中編寫一個(gè)簡(jiǎn)單的查詢來(lái)獲取我們的 ChannelList 組件的數(shù)據(jù)。這是我們的查詢:

query ChannelsListQuery {
  channels {
    id
    name
  }
}
4. 將你的組件連接 GraphQL 查詢

好,現(xiàn)在我們有了 schema 和查詢,我們只需要使用 Apollo Client 連接我們的組件!我們來(lái)安裝 Apollo Client 和一些輔助軟件包,我們需要將 GraphQL 添加到我們的應(yīng)用中:

> npm i -S react-apollo

react-apollo 是 Apollo Client 與 React 的整合,可以讓你使用名為 graphql 的高階組件來(lái)裝飾組件,它將你的 GraphQL 數(shù)據(jù)不費(fèi)力地導(dǎo)入到組件中。React Apollo 還提供了 ApolloClient,它是 Apollo 的核心,處理所有數(shù)據(jù)獲取,緩存和積極更新(我們將在另一個(gè)教程中討論)。

現(xiàn)在,我們?cè)?App.js 的頂部添加一些導(dǎo)入,并創(chuàng)建一個(gè) Apollo Client 的實(shí)例:

import {
  ApolloClient,
  gql,
  graphql,
  ApolloProvider,
} from "react-apollo";
const client = new ApolloClient();

接下來(lái),我們使用 GraphQL 高階組件來(lái)裝飾原來(lái)的 ChannelsList,該高階組件接受查詢并將數(shù)據(jù)傳遞給我們的組件:

const channelsListQuery = gql`
   query ChannelsListQuery {
     channels {
       id
       name
     }
   }
 `;
const ChannelsListWithData = graphql(channelsListQuery)(ChannelsList);

當(dāng)我們的 ChannelsList 組件使用 graphql HOC 包裝時(shí),將會(huì)收到一個(gè)名為 data 的 prop,當(dāng)它可用時(shí)會(huì)包含 channel,當(dāng)有錯(cuò)誤時(shí)會(huì)顯示 error。另外 data 還包含一個(gè) loading 屬性,當(dāng) Apollo Client 在等待數(shù)據(jù)獲取的時(shí)候它的值為 true

接下來(lái)修改我們的 ChannelsList 組件,以確保用戶知道該組件是否正在加載,或者是否出現(xiàn)錯(cuò)誤:

const ChannelsList = ({ data: {loading, error, channels }}) => {
   if (loading) {
     return 

Loading ...

; } if (error) { return

{error.message}

; }
   return 
    { channels.map( ch =>
  • {ch.name}
  • ) }
; };

最后,我們用 ChannelsListWithData 替換 App 的 render 函數(shù)中的 ChannelsList。 為了讓我們剛創(chuàng)建的組件能夠使用 Apollo Client 的實(shí)例,我們用 ApolloProvider 包裹頂級(jí)的應(yīng)用組件,這會(huì)將 Apollo Client 的一個(gè)實(shí)例放在 UI 上。

現(xiàn)在你的 App 組件應(yīng)該如下所示:

class App extends Component {
   render() {
     return (
       
         

Welcome to Apollo

); } }

好的,我們快完成了!如果你現(xiàn)在嘗試運(yùn)行,應(yīng)該會(huì)看到以下錯(cuò)誤:

起作用了!——好吧,至少部分如此。

這是怎么回事?盡管我們正確地連接了所有的組件,但我們還沒(méi)有寫一個(gè)服務(wù)器,所以當(dāng)然沒(méi)有數(shù)據(jù)可以獲取或顯示! 如果你沒(méi)有為 GraphQL 端點(diǎn)指定 URL,Apollo Client 將假定它運(yùn)行在同一個(gè)域下的 /graphql。因此我們需要?jiǎng)?chuàng)建一個(gè)具有自定義 URL 的網(wǎng)絡(luò)接口。

但是,由于本教程不是關(guān)于編寫服務(wù)器的,所以我們將利用 GraphQL 代碼即文檔這一特性,根據(jù)我們先前寫過(guò)的類型定義自動(dòng)創(chuàng)建 mock。要實(shí)現(xiàn)這一點(diǎn),我們只需要停止服務(wù)器,安裝一些其他的軟件包,然后重新啟動(dòng)它:

npm i -S graphql-tools apollo-test-utils graphql

我們將使用這些軟件包根據(jù)我們前面寫的 schema 為 Apollo Client 創(chuàng)建一個(gè)模擬網(wǎng)絡(luò)接口。將以下導(dǎo)入和定義添加到 App.js 的頂部:

import { 
  makeExecutableSchema,
  addMockFunctionsToSchema
} from "graphql-tools";
 import { mockNetworkInterfaceWithSchema } from "apollo-test-utils";
 import { typeDefs } from "./schema";
const schema = makeExecutableSchema({ typeDefs });
addMockFunctionsToSchema({ schema });
const mockNetworkInterface = mockNetworkInterfaceWithSchema({ schema });

現(xiàn)在你只需將 mockNetworkInterface 傳遞給 Apollo Client 的構(gòu)造函數(shù):

const client = new ApolloClient({
   networkInterface: mockNetworkInterface,
 });

就是這樣,你已經(jīng)完成了!你的屏幕現(xiàn)在應(yīng)該如下所示:

我們做到了,我們的第一個(gè)使用 Apollo 的 React + GraphQL 應(yīng)用!

注意:“Hello World” 只是字符串的默認(rèn)模擬文本。 如果你想自定義酷炫的 mock,請(qǐng)查看我之前寫的這篇文章。

如果某些代碼不起作用,并且你搞不清是為什么,你可以將其與此文件進(jìn)行比較,以發(fā)現(xiàn)代碼差異?;蛘?,你可以查看 t1-end Git 分支來(lái)檢查代碼。

恭喜,你已經(jīng)正式完成了教程的第一部分!可能沒(méi)什么感覺(jué),但實(shí)際上已經(jīng)做了很多工作:你已經(jīng)編寫了一個(gè) GraphQL schema,從中生成模擬數(shù)據(jù),并將 GraphQL 查詢與 React 組件相連。在本教程的其余部分中,你將了解到我們構(gòu)建一個(gè)真正的通信應(yīng)用的基礎(chǔ)。在第2部分中,我們將編寫一個(gè)簡(jiǎn)單的服務(wù)器并將其連接到我們的應(yīng)用!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89037.html

相關(guān)文章

  • 2019 簡(jiǎn)易Web開發(fā)指南

    摘要:工具軟件欲先攻其事必先利其器,用好工具是做好開發(fā)的基礎(chǔ)。框架目前最流行簡(jiǎn)單易用,越來(lái)越多人用曾經(jīng)很流行,現(xiàn)在有點(diǎn)衰退狀態(tài)管理后端渲染開發(fā)工具依賴管理,應(yīng)用打包,任務(wù)管理,編輯器擴(kuò)展,,移動(dòng)端有了前端的知識(shí)后,我們還可以開發(fā)手機(jī)。 2019年即將到來(lái),各位同學(xué)2018年辛苦了。 不管大家2018年過(guò)的怎么樣,2019年還是要繼續(xù)加油的! 在此我整理了個(gè)人認(rèn)為在2019仍是或者將成為主流的...

    vspiders 評(píng)論0 收藏0
  • 前端每周清單:Node.js 微服務(wù)實(shí)踐,Vue.js 與 GraphQL,Angular 組件技巧

    摘要:前端每周清單第期微服務(wù)實(shí)踐,與,組件技巧,攻防作者王下邀月熊編輯徐川前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項(xiàng)目巔峰人生等欄目。 前端每周清單第 26 期:Node.js 微服務(wù)實(shí)踐,Vue.js 與 GraphQL,Angular 組件技巧,HeadlessChrome 攻防 作者:王下邀月熊 編輯:徐川...

    wall2flower 評(píng)論0 收藏0
  • 平時(shí)積累的前端資源,持續(xù)更新中。。。

    本文收集學(xué)習(xí)過(guò)程中使用到的資源。 持續(xù)更新中…… 項(xiàng)目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫(kù) css js es6 移動(dòng)端 微信公眾號(hào) 小程序 webpack GraphQL 性能與監(jiān)控 高質(zhì)文章 趨勢(shì) 動(dòng)效 數(shù)據(jù)結(jié)構(gòu)與算法 js core 代碼規(guī)范...

    acrazing 評(píng)論0 收藏0
  • 前端每周清單第 48 期:Slack Webpack 構(gòu)建優(yōu)化,CSS 命名規(guī)范與用戶追蹤,Vue.

    摘要:發(fā)布是由團(tuán)隊(duì)開源的,操作接口庫(kù),已成為事實(shí)上的瀏覽器操作標(biāo)準(zhǔn)。本周正式發(fā)布,為我們帶來(lái)了,,支持自定義頭部與腳部,支持增強(qiáng),兼容原生協(xié)議等特性變化。新特性介紹日前發(fā)布了大版本更新,引入了一系列的新特性與提升,本文即是對(duì)這些變化進(jìn)行深入解讀。 showImg(https://segmentfault.com/img/remote/1460000012940044); 前端每周清單專注前端...

    sean 評(píng)論0 收藏0
  • 前端每周清單第 45 期: Safari 支持 Service Worker, Parcel 完整教

    摘要:的另一個(gè)核心特性,蘋果表示也正在開發(fā)中,按開發(fā)進(jìn)度可能幾個(gè)月后就能與我們見面。是基于的本地化數(shù)據(jù)庫(kù),支持以及瀏覽器環(huán)境。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開發(fā)教程、工程實(shí)踐、深度閱讀、開源項(xiàng)目、巔峰人生等欄目。歡迎關(guān)注【前端之巔】微信公眾號(hào)(ID: frontshow),及時(shí)獲取前端每周清單。 本期是 2017 年的最后一...

    趙春朋 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<