iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue中对接Graphql接口的实现示例
  • 685
分享到

vue中对接Graphql接口的实现示例

2024-04-02 19:04:59 685人浏览 独家记忆
摘要

说明: 本文是本人正在搞nestjs+graphql+serverless训练营中对Graphql讲解的基础知识点,可能有点前后没对接上,文中提到的Graphql授权也是下小节介绍的

说明: 本文是本人正在搞nestjs+graphql+serverless训练营中对Graphql讲解的基础知识点,可能有点前后没对接上,文中提到的Graphql授权也是下小节介绍的

一、对原来的Express返回Graphql项目修改

本章节使用的代码是express返回Graphql的代码,在使用前要先对代码进行基本的配置,比如处理跨域问题(Graphql本质也是发送一个Http请求,既然是这样在Vue项目中自然存在跨域的问题,需要先处理)

1、安装跨域的包,并且配置中间件


npm install cors

const cors = require('cors');
// 处理跨域请求
app.use(cors());

2、配置获取请求体的中间件


// 处理请求
app.use(express.JSON());//express.json=bodyParser.json
app.use(express.urlencoded({ extended: true }));

二、在vue中集成Graphql

1、参考文档地址

2、安装依赖包


npm install --save vue-apollo graphql apollo-boost graphql-tag

3、在 src/main.js中引入 apollo-boost模块并实例化 ApolloClient


import ApolloClient from 'apollo-boost'
...
const apolloClient = new ApolloClient({ 
  // 你需要在这里使用绝对路径,这里就不区分环境开发了 
  uri: 'http://localhost:8000/graphql',
});
...

4、在 src/main.js 配置 vue-apollo 插件


import VueApollo from 'vue-apollo' 
Vue.use(VueApollo);

5、创建Apollo provider提供者,并且挂载到应用中


import Vue from 'vue'
import App from './App.vue'
import ApolloClient from 'apollo-boost'
import VueApollo from 'vue-apollo' 
Vue.use(VueApollo);

Vue.config.productionTip = false

const apolloClient = new ApolloClient({ 
  // 你需要在这里使用绝对路径 
  uri: 'http://localhost:8000/graphql',
});
const apolloProvider = new VueApollo({
  defaultClient: apolloClient,
})

new Vue({
  render: h => h(App),
  // 挂载到应用
  apolloProvider,
}).$mount('#app')

三、查询数据

1、使用apollo页面进来就查询数据

根据官方的介绍,只用将apolloProvider挂载到了vue中,在vue的钩子函数中就会多一个属性apollo


<template>
  <div class="about">
    {{accountList}}
  </div>
</template>


import gql from 'graphql-tag';
export default {
  name: 'About',
  apollo: {
    accountList: gql`query {
      accountList {
        id
        username
        passWord
      }
    }`
  },
}

2、apollo中使用函数来调用


import gql from 'graphql-tag';
export default {
  apollo: {
    accountList () {
      return {
        query: gql`query {
          accountList{ 
            id
            username
            password
            created_at
          }
        }`,
      }
    },
  }
}

3、点击按钮获取数据


import gql from 'graphql-tag';
// 定义查询的schema
const accountListGql = gql`{
  accountList {
    id
    username
    password
  }
}`;

export default {
  data() {
    return {
      tableList: [],
    }
  },
  methods: {
    getTableData() {
      this.$apollo.addSmartQuery('accountList', {
        query: accountListGql,
        result(response) {
          console.log(response);
          const {accountList} = response.data;
          this.tableList = accountList;
        },
        error(error) {
          console.log('请求失败', error);
        }
      })
    }
  }
}

上面的方式也可以换成下面的写法,如果请求的业务不复杂可以这样写,如果复杂就根据上面的方式单独抽取一个schema


...
getTableData() {
  this.$apollo.addSmartQuery('accountList', {
    query: gql`{
      accountList{
        id
        username
        password
      }
    }`,
    result(response) {
      console.log(response);
      const {accountList} = response.data;
      this.tableList = accountList;
    },
    error(error) {
      console.log('请求失败', error);
    }
  })
}
...

4、传递参数的方式请求数据


handleClick (rowData) {
  this.$apollo.addSmartQuery('account', {
    query: gql`
      query($id: ID!) {
        account(id: $id) {
          id
          username
          password
        }
      }
    `,
    variables: {
      id: rowData.id,
    },
    result (response) {
      console.log('查询单条数据', response.data);
    }
  })
}

四、对查询数据方法改进

1、以上的方法可以查询数据,但是不能重复点击按钮,否则就会出现错误

2、改进版查询数据,直接使用query方法来查询


getTableData () {
  this.$apollo.query({
    query: gql`{
      accountList{
        id
        username
        password
      }
    }`,
  }).then(response => {
    console.log(response);
    const { accountList } = response.data;
    this.tableList =accountList;
  })
}

五、使用mutation添加数据

具体实现代码见下面


onSubmit () {
  this.$refs.fORM.validate(async (valid) => {
    if (valid) {
      console.log(this.form);
      const result = await this.$apollo.mutate({
        mutation: gql`
          mutation addAccount($username: String!, $password: String!) {
            addAccount(username:$username,password: $password)
          }
        `,
        variables: {
          username: this.form.username,
          password: this.form.password,
        }
      });
      console.log('更新结果', result);
    } else {
      // this.$message.error('请添加数据')
      return false;
    }
  })
}

六、优化Graphql请求

1、打开浏览器控制台点击请求Graphql接口的时候你会发现有下面三个参数

2、如果同一个数据或者说variables的值没变动的时候,是不会向后端发起请求的

3、opertionName是什么呢,我相信很多人会有疑问,看到下面两个图,我相信大家就不会疑惑了

这个操作名称就是在你使用query或者mutation的时候的名字,这个命名可以随意命名,一般建议和后端的api操作名保持一致。
这个操作名有什么用呢?我们观察Graphql发送的请求都是同一个url地址,我们在传统的Restful API的时候,我们做登录鉴权或者获取url的时候会就需要获取当前请求的地址,对于Graphql来说,这个操作名也类似这个功能,区分是哪个API来请求的。

七、优化代码

在传统的Restful api请求的时候,我们更倾向于在项目中创建一个services的文件夹来将api请求都放到一起,便于管理,很少将请求都写到vue页面中去的。在graphql中也可以如此操作,只是方式不一样。

1、在项目中创建一个graphql的文件夹,里面存放的类似Restful api的接口请求

2、在src/graphql/accountList.graphql创建关于查询的接口


query AccountList {
  accountList {
    id
    username
    password
  }
}

3、在vue中引入


import AccountList from './../graphql/accountList.graphql';
...
methods: {
  async initTableData () {
    this.tableList = [];
    this.loading = true;
    const { data, loading } = await this.$apollo.query({
      query: AccountList,
    });
    console.log(data, '请求返回数据');
    this.loading = loading;
    this.tableList = data.accountList;
  },
}
...

4、不出意外的话会直接报错,因为vue不能直接识别graphql文件,我们需要使用webpack配置对应加载graphql的loader

5、在项目根目录下创建一个vue.config.js配置loader


module.exports = {
  configureWEBpack: (config) => {
    config.module.rules.push({
      test: /\.(graphql|gql)$/,
      exclude: /node_modules/,
      loader: 'graphql-tag/loader'
    })
  },
};

6、处理数据不刷新

上面每次新增数据、删除数据、修改数据,虽然我们调用了initTableData,但是Graphql,并没有到后端,这是因为缓存的问题,需要在查询的时候添加红框圈住的字段就可以做到没次调用的时候,重新更新数据


fetchPolicy: "no-cache",

7、本章节整体的效果图

8、本小节的代码代码下载地址

到此这篇关于vue中对接Graphql接口的实现示例的文章就介绍到这了,更多相关vue对接Graphql接口 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue中对接Graphql接口的实现示例

本文链接: https://www.lsjlt.com/news/127004.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue中对接Graphql接口的实现示例
    说明: 本文是本人正在搞nestjs+graphql+serverless训练营中对Graphql讲解的基础知识点,可能有点前后没对接上,文中提到的Graphql授权也是下小节介绍的...
    99+
    2024-04-02
  • 使用python3.0 对接美团接口的实现示例
    目录前言一、请求接口的基本系统参数解析二、具体参数的代码实现总结提示:嗨咯,大家好,今天又来更新了  本章要和大家分享的是关于美团接口的实现方式以及部分代码的展示。 前言 ...
    99+
    2024-04-02
  • Vue+Springboot实现接口签名的示例代码
    1、实现思路 接口签名目的是为了,确保请求参数不会被篡改,请求的数据是否已超时,数据是否重复提交等。 接口签名示意图 客户端提交请求时,将以下参数按照约定签名方式进行签名,随后...
    99+
    2024-04-02
  • Vue 实现接口进度条示例详解
    目录实现思路代码实现参数注入总结前端在向后端请求信息时,常常需要等待一定的时间才能得到返回结果。为了提高用户体验,可以通过实现一个接口进度条函数来增加页面的交互性和视觉效果。 接口...
    99+
    2023-05-17
    Vue 接口进度条 Vue 进度条
  • C#接口重的实现示例
    这篇文章给大家介绍C#接口重的实现示例,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。派生类可以对基类中已经定义的成员方法进行重载。类似的概念引入到类对接口的实现中来,叫做接口的重实现(re-implementation...
    99+
    2023-06-17
  • Vue接口封装的示例分析
    这篇文章主要介绍了Vue接口封装的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先根据接口写好对应页面的请求内容如图尽量保证js文件名称与页面文件名称相同(易于查找...
    99+
    2023-06-15
  • Guava Retryer实现接口重试的示例
    目录前言 Guava Retryer 引入依赖 快速开始 指数退避(Exponential Backoff) 斐波那契退避(Fibonacci Backoff) 重试监听器 小结 前...
    99+
    2024-04-02
  • C#实现接口的实例
    这篇文章主要介绍“C#实现接口的实例”,在日常操作中,相信很多人在C#实现接口的实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#实现接口的实例”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#实现接...
    99+
    2023-06-17
  • Python+flask实现restful接口的示例详解
    目录>1.第一个实例:HelloWorld 2.Post 方法 3.Get 方法 4.通过变量设置动态url 1.第一个实例:HelloWorld 1.编写python代...
    99+
    2023-02-08
    Python flask实现restful接口 Python restful接口 Python flask restful接口
  • 怎么在接口回调中的使用接口对象的实例化
    本篇文章为大家展示了怎么在接口回调中的使用接口对象的实例化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。接口回调:可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调...
    99+
    2023-05-31
    接口 对象 实例化
  • Future与FutureTask接口实现示例详解
    目录正文Future类FutureTaskCallable+Future获取执行结果Callable+FutureTask获取执行结果正文 Future就是对于具体的Runnable...
    99+
    2022-11-13
    Future FutureTask接口 Future FutureTask
  • 使用Nest.js实现接口教程示例
    目录一.项目初始化二.核心文件介绍三.创建一个接口模块,处理请求四.看看cats模块有啥吧1.先看controller吧,请求方法都在这了2.你这地址有点单调啊,能不能接收query...
    99+
    2024-04-02
  • api接口对接如何实现,php如何对接api
    这篇文章来分享下api接口对接如何实现,还有源码,希望对新手有所帮助。 什么是API 我的回答:API( 应用程序编程接口):一般来说,这是一套明确定义的各种软件组件之间的通信方法。 什么是API?我们不妨用一个小故事展示出来: 研发人员A...
    99+
    2023-09-01
    php 开发语言
  • python+requests+pytest接口自动化的实现示例
    目录1、发送get请求2、发送post请求3、发送https请求4、文件上传5、文件下载6、timeout超时7、鉴权 7.1、auth参数鉴权7.2、session操作7.3、to...
    99+
    2024-04-02
  • Golang接口实现方式及示例分析
    Golang是一种静态类型、编译型语言,最初由Google设计和开发,在处理大规模项目时表现出色。Golang中的接口是一种重要的概念,它允许类型之间的互操作性,并支持多态。 Gola...
    99+
    2024-03-06
    接口 golang 示例
  • C#实现接口base调用示例详解
    目录背景方法1:使用反射找到接口实现并进行调用方法2:利用函数指针方法3:利用Fody在编译时对接口方法进行IL的call调用性能测试总结背景 在三年前发布的C#8.0中有一项重要的...
    99+
    2024-04-02
  • 实例演示:Golang中接口的使用技巧
    Golang中接口的使用技巧 Golang(又称Go语言)作为一门快速、简单、高效的编程语言,其接口机制是其特色之一。接口是一种抽象的类型,在Golang中广泛使用,可以提高代码的灵活...
    99+
    2024-02-22
    接口 技巧 golang go语言
  • VB.NET中ISpeak接口的示例分析
    这篇文章将为大家详细讲解有关VB.NET中ISpeak接口的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VB.NET接口范例在这个例子中,我定义了一个名为 ISpeak 的接口,它其中包括了三个...
    99+
    2023-06-17
  • Springboot+Redis实现API接口限流的示例代码
    添加Redis的jar包. <dependency> <groupId>org.springframework.boot</groupId&...
    99+
    2024-04-02
  • webservice实现springboot项目间接口调用与对象传递示例
    目录一、百度百科二、webservice的技术支持1、XML和XSD2、SOAP3、WSDL4、UDDI5、调用RPC与消息传递三、webservice的应用场景和弊端1、webse...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作