摘要:如果你對這系列文章有疑問或發(fā)現(xiàn)有錯誤的地方,歡迎在下方留言討論。
緊接上篇react+graphql起手和特性介紹(二),介紹完graphql與koa的服務搭建和graphql的一些常用特性,接下來我們介紹下在react中如何使用graphql
我們使用create-react-app創(chuàng)建react應用:
npm i -g create-react-app mkdir react-graphql-app create-react-app react-graphql-app
安裝以下前端依賴
npm install react-apollo graphql-tag graphql apollo-client apollo-cache-inmemory apollo-link-http
各個依賴包的作用:
apollo-link-http 請求配置和網(wǎng)絡請求能力
apollo-cache-inmemory 數(shù)據(jù)緩存
apollo-client 請求流程控制,生成請求數(shù)據(jù),錯誤控制,響應數(shù)據(jù)解析
graphql-tag 查詢類的schema數(shù)據(jù)解析,包含對應的 webpack-loader
react-apollo 連接graphql與react
graphql 提供graphql的核心執(zhí)行能力
然后我們進行react和graphql的整合
// src/index.js import React from "react"; import ReactDOM from "react-dom"; import { ApolloClient } from "apollo-client"; import { createHttpLink } from "apollo-link-http"; import { InMemoryCache } from "apollo-cache-inmemory"; import { ApolloProvider } from "react-apollo"; import App from "./App"; // 我們可以自定義fetch,對請求進行統(tǒng)一處理 const customFetch = (uri, options) => { return fetch(uri, options); }; const client = new ApolloClient({ // 連接到graphql服務器 link: createHttpLink({ uri: "http://localhost:9191/graphql", fetch: customFetch }), // 設置緩存 cache: new InMemoryCache(), }); // ApolloProvider 為react提供graphql能力 const WrappedApp = (); ReactDOM.render(WrappedApp, document.getElementById("root"));
為了能解析.graphql文件,需要修改webpack配置,添加graphql-loader
// config/webpack.config.dev.js && config/webpack.config.prod.js ... module.exports = { ... module: { strictExportPresence: true, rules: [ ... { // 解析 .graphql/.gql 后綴的loader test: /.(graphql|gql)$/, exclude: /node_modules/, loader: "graphql-tag/loader", }, ... ] } ... }
我們以post為示例,講一下在組件中要做什么操作
創(chuàng)建定義查詢的schema文件
# src/post.graphql # 導入 user.graphql #import "./user.graphql" # fragment 定義片段,可以用于多個地方 fragment PostInfo on Post { id title content userId user { ...UserInfo } } query getPost($id: ID!) { post(id: $id) { id title content userId user { id name age available birthday money gender } } } query getPosts { posts { ...PostInfo } } mutation createPost($data: PostInput!) { createPost(data: $data) { ...PostInfo } }
# src/user.graphql fragment UserInfo on User { id name age available birthday tags gender role }
// src/App.js import React, { Component } from "react"; import Post from "./Post"; class App extends Component { render() { return (); } } export default App;
// src/Post.js import React, { Component } from "react"; import { Query, Mutation, ApolloConsumer } from "react-apollo"; // 導入查詢定義,定義的查詢名次對應導入對象的方法名稱,如 getPost => postQuery.getPost import postQuery from "./post.graphql"; class Post extends Component { state = { post: {}, postId: "", newPost: { title: "", content: "", } } render() { // 由ApolloConsumer傳入我們需要的數(shù)據(jù),包含: // data 正常返回時的數(shù)據(jù) // loading 正在請求時loading會為true // error 發(fā)生錯誤時error將會有錯誤數(shù)據(jù) // 這里進行了重命名,將創(chuàng)建post,獲取posts列表進行了命名區(qū)分 const { client, getPostsData, getPostsDataLoading, createPost, createPostData, createPostLoading, getPostsDataError } = this.props; const { postId, post, newPost } = this.state; return() } } class PostWrap extends Component { render() { return ({ // loading狀態(tài)時將顯示... getPostsDataLoading ?...: ( getPostsDataError ? // 有錯誤數(shù)據(jù),將會顯示錯誤{JSON.stringify(getPostsDataError)}: // 正常則顯示請求到的數(shù)據(jù){JSON.stringify(getPostsData.posts)}) }
{ this.setState({ postId: e.target.value }) }} />{JSON.stringify(post)}
this.setState({ newPost: { ...newPost, title: e.target.value, } })} /> this.setState({ newPost: { ...newPost, content: e.target.value, } })} /> { createPostLoading ?...:{JSON.stringify(createPostData && createPostData.createPost)}}{(client) => ( // 傳入要使用的motation查詢 ) } } export default PostWrap;{( // 方法重命名 createPost, { // 狀態(tài)數(shù)據(jù)重命名 data: createPostData, loading: createPostLoading } ) => ( // 當同時多個查詢時,使用這種嵌套模式 )}{({ // 狀態(tài)數(shù)據(jù)重命名 data: getPostsData, loading: getPostsLoading, error: getPostsDataError }) => // 將重命名的狀態(tài)數(shù)據(jù)和查詢方法傳遞到組件中 // Query指定的查詢在組件加載后就會自動發(fā)起請求 )}}
通過這種方式我們可以在react中使用graphql了,這種方式極大方便了我們對請求數(shù)據(jù)api的管理,而且可以通過整合查詢,減少頁面的請求次數(shù)。
如果你對這系列文章有疑問或發(fā)現(xiàn)有錯誤的地方,歡迎在下方留言討論。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99661.html
摘要:緊接第一篇文章,起手和特性介紹一,我們接下來實現(xiàn),和自定義請求上下文,來完成創(chuàng)建用戶,發(fā)帖,查看所有帖子的功能首先,我們進行自定義請求上下文,來模擬數(shù)據(jù)庫和會話,保存我們的用戶數(shù)據(jù),帖子數(shù)據(jù),登錄狀態(tài)。 緊接第一篇文章,react+graphql起手和特性介紹(一),我們接下來實現(xiàn)resolver,和自定義請求上下文,來完成創(chuàng)建用戶,發(fā)帖,查看所有帖子的功能首先,我們進行自定義請求上下...
摘要:新聞熱點國內(nèi)國外,前端最新動態(tài)發(fā)布近日,正式發(fā)布新版本中提供了一系列的特性與問題修復。而近日正式發(fā)布,其能夠幫助開發(fā)者快速構(gòu)建應用。 前端每周清單第 10 期:Firefox53、React VR發(fā)布、JS測試技術(shù)概述、Microsoft Edge現(xiàn)代DOM樹構(gòu)建及性能之道 為InfoQ中文站特供稿件,首發(fā)地址為這里;如需轉(zhuǎn)載,請與InfoQ中文站聯(lián)系。從屬于筆者的 Web 前端入門...
摘要:前端每周清單年度總結(jié)與盤點在過去的八個月中,我?guī)缀踔蛔隽藘杉拢ぷ髋c整理前端每周清單。本文末尾我會附上清單線索來源與目前共期清單的地址,感謝每一位閱讀鼓勵過的朋友,希望你們能夠繼續(xù)支持未來的每周清單。 showImg(https://segmentfault.com/img/remote/1460000010890043); 前端每周清單年度總結(jié)與盤點 在過去的八個月中,我?guī)缀踔蛔隽?..
摘要:前端每周清單第期微服務實踐,與,組件技巧,攻防作者王下邀月熊編輯徐川前端每周清單專注前端領域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點分為新聞熱點開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。 前端每周清單第 26 期:Node.js 微服務實踐,Vue.js 與 GraphQL,Angular 組件技巧,HeadlessChrome 攻防 作者:王下邀月熊 編輯:徐川...
摘要:感謝王下邀月熊分享的前端每周清單,為方便大家閱讀,特整理一份索引。王下邀月熊大大也于年月日整理了自己的前端每周清單系列,并以年月為單位進行分類,具體內(nèi)容看這里前端每周清單年度總結(jié)與盤點。 感謝 王下邀月熊_Chevalier 分享的前端每周清單,為方便大家閱讀,特整理一份索引。 王下邀月熊大大也于 2018 年 3 月 31 日整理了自己的前端每周清單系列,并以年/月為單位進行分類,具...
閱讀 3574·2023-04-26 02:05
閱讀 2016·2021-11-19 11:30
閱讀 4226·2021-09-30 09:59
閱讀 3182·2021-09-10 10:51
閱讀 2612·2021-09-01 10:30
閱讀 1491·2021-08-11 11:20
閱讀 2621·2019-08-30 15:54
閱讀 571·2019-08-30 10:49