前置知识:React/Redux/Restful API
关于为什么要使用GraphQL 前面已有几篇文章铺垫,这里主要总结用法。开始使用GraphQL之前,要安装一些依赖:
apollo-boost 包含启动阿波罗客户端的所有依赖
react-apollo 视图层面的集合
graphql-tag 解析查询语句必须
graphql 也是解析查询语句
强烈安利https://codesandbox.io运行实践,可以减少电脑文件夹的凌乱感……下图是安装依赖的步骤:
初始化完成后,页面显示正常。这时需要从依赖里引入几样东西:
引入ApolloClient并新建一个实例client;
引入ApolloProvider并且包裹页面组件,ApolloProvider有一个属性client用于连接GraphQL和React,它的用法类似Redux里的Provider。
引入gql用于解析GraphQL;
引入Query组件用于包裹页面组件。
Query组件是这个项目里面最重要的组件之二,另外一个是Mutation。可以认为他们分别对应着Restful API 里面的GET和POST/PUT/DELETE等功能。
以下图查询狗类品种为例,在第12行gql语句部分声明查询狗的id和breed种类。然后第28行将该查询语句作为Query组件的query属性值,在第33行渲染部分,我们遍历返回值,在页面显示所有的狗的品种名称,得到右图的结果。
如果我们只想查询某一品种的狗的图片,可以通过variables属性传递参数,在第16行查询语句里新增查询的字段名,第23行传递我们想查询的实参mix,第28行添加形参breed品种,右图也成功地查询到了该品种的图片。
Query部分的基本用法就是这样,如果还有显示加载状态、错误处理、轮询和重新获取的需求,可以继续参阅文档。https://www.apollographql.com/docs/react/essentials/queries.html
相比Query部分,Mutation部分复杂一点,但是道理是相通的。这里以(万年不变的)新增和编辑TODO为例,项目包括1个Query和2个Mutation,Query部分总是查询当前的待办事项,Mutation部分则是处理新增和编辑的操作。
可以看到,两处的gql语句的写法,我们要拿到的值只有事项的id 和 事项内容的type 两个。
写一个输入框,点击新增按钮后,输入框的内容便新增到了页面,Mutation的属性只有mutation和children是必须的。
其他的属性也可圈可点,update有很多实用的方法,比如可以通过cache.readQuery 和 cache.writeQuery查询和修改Query,就好像是和服务端通信一样,update第二个参数是一个包含Mutation结果的对象。
optimisticResponse 可以让页面响应更快,你的调用会被执行两次,一次是页面的结果,另一次是真实的结果。比如一个评论功能,当你点击提交按钮的时候,页面立即就更新了而无需等待服务端响应。