我是React和GatsbyJS的新手。我很困惑,无法以一种简单的方式弄清楚如何从第三方Restful API加载数据。
例如,我想从randomuser.me/API获取数据,然后能够使用页面中的数据。
我们这样说:
import React from 'react' import Link from 'gatsby-link' class User extends React.Component { constructor(){ super(); this.state = { pictures:[], }; } componentDidMount(){ fetch('https://randomuser.me/api/?results=500') .then(results=>{ return results.json(); }) .then(data=>{ let pictures = data.results.map((pic,i)=>{ return( <div key={i} > <img key={i} src={pic.picture.medium}/> </div> ) }) this.setState({pictures:pictures}) }) } render() { return (<div>{this.state.pictures}</div>) } } export default User;
但是我想得到GraphQL的帮助,以便对用户进行过滤和排序等。
您能否帮助我找到如何获取数据并将其插入GraphQL的示例gatsby-node.js?
gatsby-node.js
如果您想使用GraphQL来获取数据,则必须创建一个sourceNode。有关创建源插件的文档可以为您提供帮助。
sourceNode
请按照以下步骤操作,以使用randomuserGatsby项目中的GraphQL 查询数据。
randomuser
在您的根项目文件夹中,将此代码添加到gatsby-node.js:
const axios = require('axios'); const crypto = require('crypto'); exports.sourceNodes = async ({ boundActionCreators }) => { const { createNode } = boundActionCreators; // fetch raw data from the randomuser api const fetchRandomUser = () => axios.get(`https://randomuser.me/api/?results=500`); // await for results const res = await fetchRandomUser(); // map into these results and create nodes res.data.results.map((user, i) => { // Create your node object const userNode = { // Required fields id: `${i}`, parent: `__SOURCE__`, internal: { type: `RandomUser`, // name of the graphQL query --> allRandomUser {} // contentDigest will be added just after // but it is required }, children: [], // Other fields that you want to query with graphQl gender: user.gender, name: { title: user.name.title, first: user.name.first, last: user.name.last, }, picture: { large: user.picture.large, medium: user.picture.medium, thumbnail: user.picture.thumbnail, } // etc... } // Get content digest of node. (Required field) const contentDigest = crypto .createHash(`md5`) .update(JSON.stringify(userNode)) .digest(`hex`); // add it to userNode userNode.internal.contentDigest = contentDigest; // Create node with the gatsby createNode() API createNode(userNode); }); return; }
我曾经axios获取数据,所以您需要安装它:npm install --save axios
axios
npm install --save axios
目标是为要使用的每个数据创建每个节点。根据createNode文档,您必须为对象提供一些必填字段(id,parent,internal,children)。
从randomuser API获取结果数据后,只需创建此节点对象并将其传递给createNode()函数即可。
createNode()
在这里,我们映射到您想要获得500个随机用户的结果https://randomuser.me/api/?results=500。
https://randomuser.me/api/?results=500
userNode使用必填字段和所需字段创建对象。您可以根据要在应用程序中使用的数据添加更多字段。
userNode
只需使用createNode()Gatsby API 的功能创建节点。
完成后,运行gatsby develop并转到http:// localhost:8000 / ___ graphql。
gatsby develop
您可以使用GraphQL创建完美的查询。当我们将internal.type节点对象命名为时'RandomUser',我们可以进行查询allRandomUser以获取数据。
internal.type
'RandomUser'
allRandomUser
{ allRandomUser { edges { node { gender name { title first last } picture { large medium thumbnail } } } } }
例如src/pages/index.js,在您的页面中,使用查询并显示您的数据:
src/pages/index.js
import React from 'react' import Link from 'gatsby-link' const IndexPage = (props) => { const users = props.data.allRandomUser.edges; return ( <div> {users.map((user, i) => { const userData = user.node; return ( <div key={i}> <p>Name: {userData.name.first}</p> <img src={userData.picture.medium} /> </div> ) })} </div> ); }; export default IndexPage export const query = graphql` query RandomUserQuery { allRandomUser { edges { node { gender name { title first last } picture { large medium thumbnail } } } } } `;
这就对了!