- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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 的帮助来过滤和排序用户等等......
您能帮我找到如何获取数据并将其插入 gatsby-node.js
上的 GraphQL 的示例吗?
最佳答案
如果您想使用 GraphQL 来获取数据,则必须创建一个 sourceNode
。关于 creating a source plugin 的文档可以帮助你。
按照以下步骤操作,即可在 Gatsby 项目中使用 GraphQL 查询 randomuser
数据。
在根项目文件夹中,将此代码添加到 gatsby-node.js
:
const axios = require('axios');
const crypto = require('crypto');
exports.sourceNodes = async ({ actions }) => {
const { createNode } = actions;
// 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;
}
I used
axios
to fetch data so you will need to install it:npm install --save axios
目标是为您要使用的每条数据创建每个节点。根据createNode documentation ,您必须提供一个具有很少必填字段(id、parent、internal、children)的对象。
从 randomuser API 获取结果数据后,您只需创建此节点对象并将其传递给 createNode()
函数。
这里我们映射到您想要获得 500 个随机用户的结果https://randomuser.me/api/?results=500
。
使用必填字段和所需字段创建 userNode
对象。您可以根据您想要在应用程序中使用的数据添加更多字段。
只需使用 Gatsby API 的 createNode()
函数创建节点即可。
完成此操作后,运行 gatsbydevelop
并转到 http://localhost:8000/___graphql .
您可以使用 GraphQL 来创建完美的查询。由于我们将节点对象的 internal.type
命名为 'RandomUser'
,因此我们可以查询 allRandomUser
来获取数据。
{
allRandomUser {
edges {
node {
gender
name {
title
first
last
}
picture {
large
medium
thumbnail
}
}
}
}
}
在您的页面(例如 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
}
}
}
}
}
`;
就是这样!
关于reactjs - GatsbyJS 从 Restful API 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49299309/
注意:感谢@Ferran Buireu 的建议。由于对 docker 非常陌生,并且将网络世界更改为系统和编程,我很肯定会得到负票。 部署gatsbyjs后,发现socketio错误“net::ERR
我是 gatsbyjs 的新手。遵循所有教程并开始使用 Saasland 模板使用 gatsbyjs 创建网站。我已经用 npm 安装了 bootstrap。该模板具有以下 vendor 特定的依赖项
我正在尝试在 Visual Studio 代码中调试我的 gatsbyjs 代码。我按照文档并尝试了稍微不同的方法,例如 https://github.com/Microsoft/vscode-rec
有人可以谈谈或将我链接到包发布策略背后的理由吗?我想知道为什么有这么多“仅版本提升”的版本,它使变更日志过于冗长并且 => 难以及时升级软件包。它还使版本差异变得更加困难。 例如https://git
我正在用 gatsbyjs 构建一个站点。就seo而言,我认为“onClick”是不可抓取的。所以也许有人可以帮助我。 我有这个: render={data => (
我的问题:我试图将 Gatsby 与 headless WordPress 集成并成功地做到了。我从 WordPress 动态制作了多个菜单,并通过 GraphQL 调用这些菜单。每件事似乎都运行良好
我如何为 Gatsby 创建一个将在客户端加载而不是在构建时加载的组件? 我创建了这个,它使用 gatsby develop 呈现,但不使用呈现的服务器端呈现 import React from 'r
我想要这样的路线:/blog/:blogId/:slug 我在我的 gatsby-node.js 中试过了 - exports.onCreatePage = async ({ page, action
我无法理解如何在 GatsbyJS 中为 GraphQL 查询编写过滤器。 这有效: filter: { contentType: { in: ["post", "page"] } 我基本上需要相反的
我正在尝试使用 Gatsby JS 和 Material UI 创建一个网站。存储网站内容的首选方式是什么。该网站将只是一个小型企业的宣传网站。 我是否只保留组件中的文本。或者我需要将它保存在单独的文
我在 GatsbyJS 中使用单页模板,菜单滚动到同一页面的不同部分(#home、#about、#portfolio 等)。有没有办法在链接上设置事件类名,突出显示用户所在的链接? 最佳答案 Link
因此,我在 Netlify 上托管了一个网站。我遵循了他们网站上的文档(关于表单),部署后表单的名称显示在我的 Netlify dash 上,但没有任何提交通过。 我可以帮忙吗? 这是我的 Conta
我希望托管一个 gatsbyjs 博客,该博客从 Contentful 中获取数据,类似于以下示例。 https://github.com/gatsbyjs/gatsby/tree/master/ex
我的目标是从本地插件创建页面。我写了一个名为 my-custom-plugin 的自定义插件。我还安装了 gatsby-plugin-page-creator 插件,以在默认 pages 目录之外自动
我正在使用 GatsbyJS,并且我正在尝试根据 URL 的路由呈现不同的 header。 示例: mydomain.com/ => 应呈现 HeaderLanding mydomain.com/bl
我正在使用 gatsby-plugin-styled-components 来设置下面元素的样式。 import React from 'react'; import styled from 'sty
我是 GatsbyJS 和 ReactJS 的新手,在构建项目时遇到问题。问题是每当我在其中构建带有 AOS 的项目时,它都会显示错误窗口未定义。当我在开发模式下运行时完全没问题。 这是我的代码: 我
我想在我的 gatsby 生成的网站中创建一个使用 slug 作为参数的路由。 我有一个位于路线 /projects/ 上的项目列表. 通常使用 react router 我会创建一个这样的路由:
我将 Strapi 用作 Headless CMS,并使用 Gatsby + Graphql 构建我的前端。我有一个“ block 渲染器”组件,用于渲染 strapi 中的任何动态区域。 impor
我处于一个有点不幸的位置,几年前某人的设计选择现在正在影响我重建网站。基本上,早在网站最初创建时,设计者就插入所有 URL 完全显式地使用 .html 扩展名(例如 website.com/index
我是一名优秀的程序员,十分优秀!