天天看点

vue+graphql实践

graphql提供了5种标量:

Int:32位有符号整型,超出精度范围后,引擎会抛出异常

Float:有符号双精度浮点数,超出精度范围后,引擎会抛出异常

String:字符串,用于表示 ​

​UTF-8​

​ 字符序列

Boolean:布尔值,

ID:资源唯一标识符

首先是后端

const koa=require('koa')
const app=new koa();
const cors=require('koa2-cors')
app.use(cors())
var graphqlHTTP=require('koa-graphql')
const mount=require('koa-mount')
const Router=require('koa-router')
const router=new Router()

const {GraphQLObjectType,
    GraphQLString,
    GraphQLInt,
    GraphQLList,
    GraphQLSchema,
    GraphQLID
    }=require('graphql');


var navSchema=new GraphQLObjectType({
    name:'nav',
    fields:{
        id:{type:GraphQLID},
        url:{type:GraphQLString},
        age:{type:GraphQLInt}
    }
})
var root=new GraphQLObjectType({
    name:'root',
    fields:{
        navList:{type:new GraphQLList(navSchema),
               async resolve(parent,args){
                   console.log(parent)
                   console.log(args)
                   return[{id:'xx',url:'xx',age:10},{id:'xx',url:'xx',age:10}]
               }
                }
    }
})

var schema=new GraphQLSchema({query:root})
app.use(mount('/graphql',graphqlHTTP({schema:schema,graphiql:true})))

app.use(router.routes())
app.use(router.allowedMethods())
app.listen(4000,()=>{
    console.log('监听端口号')
})      

然后是前端

import Vue from 'vue'
import VueApollo from 'vue-apollo'
import ApolloClient from 'apollo-boost'
import App from './App.vue'
import VueRouter from 'vue-router'
import router from './router'
const apolloClient=new ApolloClient({uri:'http://localhost:4000/graphql'})

const apolloProvider=new VueApollo({defaultClient:apolloClient})
Vue.use(VueApollo)
Vue.use(VueRouter)
Vue.config.productionTip = false
console.log(apolloProvider)
new Vue({
    apolloProvider,
    router,
    render: h => h(App),
}).$mount('#app')      

查询

import gql from 'graphql-tag'
 export default {

  apollo:{navList: gql`{navList{url}}`
   
  },
  mounted(){
    console.log(this.navList)
  },
 }      

还可以在方法上定义,还可以传递参数

var articleSchema=new GraphQLObjectType({
                                            name:'article',
                                        fields:{name:{type:GraphQLString},
                             text:{type:GraphQLString}
                             }
                                            })
var navSchema=new GraphQLObjectType({
    name:'nav',
    fields:{
        id:{type:GraphQLID},
        url:{type:GraphQLString},
        age:{type:GraphQLInt}
    }
})
var root=new GraphQLObjectType({name:'root',
                               fields:{
                                 navList:{type:new GraphQLList(navSchema),
                                         args:{_id:{type:new GraphQLNonNull(GraphQLString)}},
                                         async resolve(parent,args){
                                                console.log(args)//参数
                                            return [{id:'1',url:'xx',arg:10}]
                                         } 
                                         }
                                 article:{type:articleSchema,
                                         async resolve(){return {name:'hello',text:'123456'}}
                                         }}
                               })
var schema=new GraphQLSchema({query:root})
app.use(mount('/graphql',graphqlHttp({schema:schema,graphiql:true})))
app.use(router.routes())
app.use(router.allowedMethods())
app.listen(4000,()=>{
    console.log('监听端口号')
})      

前端查询

this.$apollo.query({query:gql`query{article{name,text}}`}).then(data=>{console.log(data)})
     
this.$apollo.query({query:gql`query($_id:String!){navList(_id:$_id){url}}`,variables:{_id:'xx'}})
  .then(data=>{console.log(data)})