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

資訊專欄INFORMATION COLUMN

react+graphql起手和特性介紹(三)

soasme / 2522人閱讀

摘要:如果你對(duì)這系列文章有疑問(wèn)或發(fā)現(xiàn)有錯(cuò)誤的地方,歡迎在下方留言討論。

緊接上篇react+graphql起手和特性介紹(二),介紹完graphql與koa的服務(wù)搭建和graphql的一些常用特性,接下來(lái)我們介紹下在react中如何使用graphql
我們使用create-react-app創(chuàng)建react應(yīng)用:

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

各個(gè)依賴包的作用:

apollo-link-http 請(qǐng)求配置和網(wǎng)絡(luò)請(qǐng)求能力

apollo-cache-inmemory 數(shù)據(jù)緩存

apollo-client 請(qǐng)求流程控制,生成請(qǐng)求數(shù)據(jù),錯(cuò)誤控制,響應(yīng)數(shù)據(jù)解析

graphql-tag 查詢類(lèi)的schema數(shù)據(jù)解析,包含對(duì)應(yīng)的 webpack-loader

react-apollo 連接graphql與react

graphql 提供graphql的核心執(zhí)行能力

然后我們進(jìn)行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,對(duì)請(qǐng)求進(jìn)行統(tǒng)一處理
const customFetch = (uri, options) => {
    return fetch(uri, options);
};


const client = new ApolloClient({
    // 連接到graphql服務(wù)器
    link: createHttpLink({ uri: "http://localhost:9191/graphql", fetch: customFetch }),
    // 設(shè)置緩存
    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

# 導(dǎo)入 user.graphql
#import "./user.graphql"

# fragment 定義片段,可以用于多個(gè)地方
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";
// 導(dǎo)入查詢定義,定義的查詢名次對(duì)應(yīng)導(dǎo)入對(duì)象的方法名稱,如 getPost => postQuery.getPost
import postQuery from "./post.graphql";

class Post extends Component {
    state = {
        post: {},
        postId: "",
        newPost: {
            title: "",
            content: "",
        }
    }

    render() {
        // 由ApolloConsumer傳入我們需要的數(shù)據(jù),包含:
        // data 正常返回時(shí)的數(shù)據(jù)
        // loading 正在請(qǐng)求時(shí)loading會(huì)為true
        // error 發(fā)生錯(cuò)誤時(shí)error將會(huì)有錯(cuò)誤數(shù)據(jù)
        // 這里進(jìn)行了重命名,將創(chuàng)建post,獲取posts列表進(jìn)行了命名區(qū)分
        const { 
            client, 
            getPostsData, getPostsDataLoading,
            createPost, createPostData, createPostLoading, 
            getPostsDataError
        } = this.props;

        const { postId, post, newPost } = this.state;
        return(
            
{ // loading狀態(tài)時(shí)將顯示... getPostsDataLoading ?
...
: ( getPostsDataError ? // 有錯(cuò)誤數(shù)據(jù),將會(huì)顯示錯(cuò)誤
{JSON.stringify(getPostsDataError)}
: // 正常則顯示請(qǐng)求到的數(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)}
}
) } } class PostWrap extends Component { render() { return ( {(client) => ( // 傳入要使用的motation查詢 {( // 方法重命名 createPost, { // 狀態(tài)數(shù)據(jù)重命名 data: createPostData, loading: createPostLoading } ) => ( // 當(dāng)同時(shí)多個(gè)查詢時(shí),使用這種嵌套模式 {({ // 狀態(tài)數(shù)據(jù)重命名 data: getPostsData, loading: getPostsLoading, error: getPostsDataError }) => // 將重命名的狀態(tài)數(shù)據(jù)和查詢方法傳遞到組件中 // Query指定的查詢?cè)诮M件加載后就會(huì)自動(dòng)發(fā)起請(qǐng)求 } )} )} ) } } export default PostWrap;

通過(guò)這種方式我們可以在react中使用graphql了,這種方式極大方便了我們對(duì)請(qǐng)求數(shù)據(jù)api的管理,而且可以通過(guò)整合查詢,減少頁(yè)面的請(qǐng)求次數(shù)。
如果你對(duì)這系列文章有疑問(wèn)或發(fā)現(xiàn)有錯(cuò)誤的地方,歡迎在下方留言討論。

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

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

相關(guān)文章

  • react+graphql手和特性介紹(二)

    摘要:緊接第一篇文章,起手和特性介紹一,我們接下來(lái)實(shí)現(xiàn),和自定義請(qǐng)求上下文,來(lái)完成創(chuàng)建用戶,發(fā)帖,查看所有帖子的功能首先,我們進(jìn)行自定義請(qǐng)求上下文,來(lái)模擬數(shù)據(jù)庫(kù)和會(huì)話,保存我們的用戶數(shù)據(jù),帖子數(shù)據(jù),登錄狀態(tài)。 緊接第一篇文章,react+graphql起手和特性介紹(一),我們接下來(lái)實(shí)現(xiàn)resolver,和自定義請(qǐng)求上下文,來(lái)完成創(chuàng)建用戶,發(fā)帖,查看所有帖子的功能首先,我們進(jìn)行自定義請(qǐng)求上下...

    NikoManiac 評(píng)論0 收藏0
  • 前端每周清單第 10 期:Firefox53、React VR發(fā)布、Microsoft Edge現(xiàn)代

    摘要:新聞熱點(diǎn)國(guó)內(nèi)國(guó)外,前端最新動(dòng)態(tài)發(fā)布近日,正式發(fā)布新版本中提供了一系列的特性與問(wèn)題修復(fù)。而近日正式發(fā)布,其能夠幫助開(kāi)發(fā)者快速構(gòu)建應(yīng)用。 前端每周清單第 10 期:Firefox53、React VR發(fā)布、JS測(cè)試技術(shù)概述、Microsoft Edge現(xiàn)代DOM樹(shù)構(gòu)建及性能之道 為InfoQ中文站特供稿件,首發(fā)地址為這里;如需轉(zhuǎn)載,請(qǐng)與InfoQ中文站聯(lián)系。從屬于筆者的 Web 前端入門(mén)...

    MingjunYang 評(píng)論0 收藏0
  • 前端每周清單年度總結(jié)與盤(pán)點(diǎn)

    摘要:前端每周清單年度總結(jié)與盤(pán)點(diǎn)在過(guò)去的八個(gè)月中,我?guī)缀踔蛔隽藘杉?,工作與整理前端每周清單。本文末尾我會(huì)附上清單線索來(lái)源與目前共期清單的地址,感謝每一位閱讀鼓勵(lì)過(guò)的朋友,希望你們能夠繼續(xù)支持未來(lái)的每周清單。 showImg(https://segmentfault.com/img/remote/1460000010890043); 前端每周清單年度總結(jié)與盤(pán)點(diǎn) 在過(guò)去的八個(gè)月中,我?guī)缀踔蛔隽?..

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

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

    wall2flower 評(píng)論0 收藏0
  • 王下邀月熊_Chevalier的前端每周清單系列文章索引

    摘要:感謝王下邀月熊分享的前端每周清單,為方便大家閱讀,特整理一份索引。王下邀月熊大大也于年月日整理了自己的前端每周清單系列,并以年月為單位進(jìn)行分類(lèi),具體內(nèi)容看這里前端每周清單年度總結(jié)與盤(pán)點(diǎn)。 感謝 王下邀月熊_Chevalier 分享的前端每周清單,為方便大家閱讀,特整理一份索引。 王下邀月熊大大也于 2018 年 3 月 31 日整理了自己的前端每周清單系列,并以年/月為單位進(jìn)行分類(lèi),具...

    2501207950 評(píng)論0 收藏0

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

0條評(píng)論

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