使用Gatsby+GraphQL来加载JSON数据,并在React Bootstrap表格中显示
使用Gatsby+GraphQL读取JSON数据,并在React bootstrap表格中显示
我有一个从Angular Material2的mat-table导出的JSON文件,但是发现将其手动复制到HTML的bootstrap Table中是不可能的,所以我在Gatsby中找到了一种方法,可以一次性加载并显示它。
用Gatsby + GraphQL从JSON文件读取数据
这篇文章的作者是Emma Bostian,她是一位在德国居住的美国人。她的Twitter上有10万名粉丝(令人惊讶)。
目标
手头有数百条数据的JSON文件如下。
/* Symptoms.json */
[
{"症状名": "関節痛", "症状名(英語)": "Aching joints"},
{"症状名": "筋肉痛", "症状名(英語)": "aching muscles"},
{"症状名": "急性過興奮状態", "症状名(英語)": "Acute hyper excited state"},
・・・以下略・・・
]
将以下内容用中文本地化,只需要一个选项:
[HTML]
<Table striped bordered hover variant="dark" size="sm" responsive>
<tbody>
<th>症状名</th><th>症状名(英語)</th>
<tr><td>関節痛</td><td>Aching joints</td></tr>
<tr><td>筋肉痛</td><td>aching muscles</td></tr>
<tr><td>悪寒</td><td>Chills</td></tr>
<!--・・・以下略・・・-->
</tbody>
</Table>
动态显示如何加载JSON。
总之,可以通过一个名为gatsby-transformer-json的插件来实现。
前提 – 只需要一个选项,用汉语来重新表达以下句子:
首要条件
・已创建了Gatsby项目
・已引入React bootstrap。参考:在Gatsby中引入React bootstrap和导航栏。
引入的方式
JSON文件的位置
在Gatsby项目中创建一个名为src/data/的文件夹。然后将JSON文件放在该文件夹下。在这里我放置了Symptoms.json文件。
由于Symptoms.json文件的键名是日语会有不便之处,所以我已经将它替换为了英语。
[
{"SymptomNameJ": "関節痛", "SymptomNameE": "Aching joints"},
{"SymptomNameJ": "筋肉痛", "SymptomNameE": "aching muscles"},
{"SymptomNameJ": "急性過興奮状態", "SymptomNameE": "Acute hyper excited state"},
・・・略・・・
]
安装插件
安装gatsby-transformer-json和gatsby-source-filesystem。
$ yarn add gatsby-transformer-json gatsby-source-filesystem
在配置文件中进行设置
在gatsby-config.js文件中按照以下方式进行描述
// ・・・略・・・
`gatsby-transformer-json`,
{
resolve: `gatsby-source-filesystem`,
options: {
name: `data`,
path: `${__dirname}/src/data/`,
},
},
// ・・・略・・・
路径:`${__dirname}/src/data/`是为存放JSON文件而创建的文件夹。
制作组件
可以在index.js文件中进行,但在这里我们将在pages文件夹下创建Symptoms.js文件。
创建完后,首先需要导入StaticQuery和graphql,以便能够读取JSON数据,代码如下。
import { graphql, StaticQuery } from "gatsby"
描述查询属性
使用GraphQL来描述查询属性。
graphql
`query SymptomsQuery {
allSymptomsJson {
edges {
node {
SymptomNameJ
SymptomNameE
}
}
}
}`
查询名称SymptomsQuery实际上是将Query与Symptoms这个组件名称随意地拼凑在一起的。我认为是任意的。
allSymptomsJson 是一个根据命名规则从Symptoms.json中获取的数据,因此它由 all + Symptoms + Json 组成(即 allSymptomsJson)。您可以在 http://localhost:8000/___graphql 上进行确认。
渲染
只需使用render={}进行渲染。代码如下所示。
<StaticQuery
query={graphql`
query WithdrawalSymptomsQuery {
allWithdrawalSymptomsJson {
edges {
node {
SymptomNameJ
SymptomNameE
}
}
}
}
`}
render={data => (
<>
<Table striped bordered hover variant="dark" size="sm" responsive>
<tbody>
<th>症状名</th><th>症状名(英語)</th>
{getSymptoms(data)}
</tbody>
</Table>
</>
)}
/>
如你所见,在元素内写入所有内容。
在{getSymptoms(data)}这个部分,从JSON数据中读取,将表格的
[症状名][英语症状名]
作为数组输出。这个函数如下所示。Emma称之为Helper Function,但是是Helper函数吗?
function getSymptoms(data) {
const SymptomsArray = [];
data.allSymptomsJson.edges.forEach(item =>
SymptomsArray.push(
<tr>
<td key={item.node.SymptomNameJ}>{item.node.SymptomNameJ}</td>
<td key={item.node.SymptomNameE}>{item.node.SymptomNameE}</td>
</tr>
)
);
return SymptomsArray;
}
代码的全部内容 de
Symtomps.js 代码全文:
import React from "react"
import { graphql, StaticQuery } from "gatsby"
import { Container, Table } from 'react-bootstrap'
const Symptoms = () => (
<Container fluid="md">
<StaticQuery
query={graphql`
query WithdrawalSymptomsQuery {
allWithdrawalSymptomsJson {
edges {
node {
SymptomNameJ
SymptomNameE
}
}
}
}
`}
render={data => (
<>
<Table striped bordered hover variant="dark" size="sm" responsive>
<tbody>
<th>症状名</th><th>症状名(英語)</th>
{getSymptoms(data)}
</tbody>
</Table>
</>
)}
/>
</Container>
function getSymptoms(data) {
const SymptomsArray = [];
data.allSymptomsJson.edges.forEach(item =>
SymptomsArray.push(
<tr>
<td key={item.node.SymptomNameJ}>{item.node.SymptomNameJ}</td>
<td key={item.node.SymptomNameE}>{item.node.SymptomNameE}</td>
</tr>
)
);
return SymptomsArray;
}
export default Symptoms
以上的内容。
这本书的宣传
《了不起的盖茨比》版本5>>>>修订2版
将前篇《用最新的Gatsby构建企业网站》和后篇《用最新的Gatsby和microCMS构建具有网站内搜索功能的企业网站》合并,创建以下示范网站:
→ https://yah-space.work
通过使用静态网站生成器Gatsby的最新版本5以及文件系统路由API,解释如何动态生成页面。此外,介绍版本5中的新功能《Slicy API》、《Script API》和《Head API》,并提供实现方法。还包括使用《Gatsby Functions》实现查询表单以及将网站上传至Gatsby Cloud的方法!
用最新的Gatsby 5和microCMS结合创建公司网站的操作步骤进行解释。使用Gatsby版本4中的新功能《Gatsby Functions》和《microCMS的q参数》来实现《网站内搜索功能》。此外,我们还会介绍如何自定义SEO组件并将microCMS的API显示在Twitter卡片中作为OGP标签的实现方法。
参考:使用Gatsby + GraphQL从JSON文件中读取数据