国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

soasme / 2517人閱讀

摘要:如果你對這系列文章有疑問或發(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(
            
{ // 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)}
}
) } } class PostWrap extends Component { render() { return ( {(client) => ( // 傳入要使用的motation查詢 {( // 方法重命名 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ā)起請求 } )} )} ) } } export default PostWrap;

通過這種方式我們可以在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

相關(guān)文章

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

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

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

    摘要:新聞熱點國內(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 前端入門...

    MingjunYang 評論0 收藏0
  • 前端每周清單年度總結(jié)與盤點

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

    jackwang 評論0 收藏0
  • 前端每周清單:Node.js 微服務實踐,Vue.js 與 GraphQL,Angular 組件技巧

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

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

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

    2501207950 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<