我用React制作了一个应用程序【2】【天气应用程序②】
首先
学习的原因和经过
2020年开始,我决定从零开始转职成为一名工程师,并进入某编程学校学习。入学后我发现很多人从零开始学习Ruby,并且Ruby的工作机会远远不如我想象的少。因此毕业后,我决定转向成为一名前端工程师。我将通过记录React学习的过程来深化我的理解和备忘。
具体的步骤 de
-
- 在PlayGround中进行探索并设置参数。
-
- 使用ChakraUI配置前端。
-
- 处理请求。
-
- 使用响应在前端显示。
- 使用ChakraUI显示加载状态并启用暗黑模式。
GraphQL是一种查询语言
「GraphQL」是Facebook开发和提供的Web API查询语言。
它是由查询语言和模式语言构成的Web API规范,正如名字所示,可以向服务器查询数据。GraphQL于2012年由Facebook开发,并在2015年开源。
GraphQL支持各种操作系统,可进行跨平台开发。此外,它还支持多种编程语言,如Java、JavaScript、Ruby等,这也是其特点之一。
GraphQL的优点和缺点是什么?
GraphQL的优点有以下3点。
① 通过较少的请求可以访问多个资源。
② 仅获取最少量的数据。
③ 可以更新API而保留现有的查询。
① 只需少数请求即可访问多个资源
由于不依赖于HTTP结构,可以获取多个页面所需的数据。因此,请求不会被浪费,难以导致性能下降,也不会给服务器带来负担,从而可以降低硬件成本。
仅获取最少量的数据。
GraphQL允许指定获取的数据并发送请求。例如,只需指定姓名和电子邮件地址即可向服务器查询,通过这种方式,可以仅获取所需的数据,避免通信浪费,同时也能提高性能。
只需一种选择即可,以下是中文的翻译:
③ 可以在不破坏现有的查询的情况下更新API。
除非自行删除字段,否则不会破坏查询,这样就不会对客户端行为产生影响,能够保持更新后的请求的稳定性。
GraphQL的缺点有以下两个。
① 由于是新技术,所以信息很少。
② 缓存变得复杂。
① 由于这项技术很新,所以相关信息较少。
由于GraphQL是一个相对较新的规范,因此信息量较少。如果是自学的话,需要在有限的信息中进行学习,所以要掌握它需要一定的时间。
现金变得复杂。
GraphQL的缓存机制不会生成URL,同时响应内容也会发生变化,因此相对复杂。这就使得通过CDN进行负载处理变得困难,并且可能对客户端产生负面影响。
在PlayGround中进行探索并设置参数。
访问天气API,可以看到交互式游乐场正在运行。这里显示的是一个包含许多参数的查询。执行此查询时,将显示包含输入参数的结果数据的响应。在这里使用的参数是name、weather、temperature和wind。
修正后的查询如下。
query {
getCityByName(name: <Your_City>) {
name
weather {
summary {
title
description
}
temperature {
actual
feelsLike
}
wind {
speed
}
}
}
}
请在”Your_City”的位置输入您所居住的城市或任何其他城市名称。
目前并不使用所有数据,暂时执行查询。
2. 通过ChakraUI配置前端设置
使用 Chakra UI 进行前端设置。
使用npm工具来安装Chakra UI。
npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^4
在根文件(src/index.js)中设置提供者。
import React from 'react'
import ReactDOM from 'react-dom'
import { ChakraProvider, ColorModeScript } from '@chakra-ui/react'
import App from './components/App'
ReactDOM.render(
<ChakraProvider>
<ColorModeScript initialColorMode="light" />
<App />
</ChakraProvider>,
document.getElementById('root')
)
创建一个名为Dashboard.js的新组件,在src/components目录下,用于跟踪光明模式和暗黑模式。在最后部分启用该组件。
创建用于切换暗模式的图标按钮。
import React from 'react'
import { VStack, IconButton } from '@chakra-ui/react'
export default function Dashboard ( ) {
return (
<VSack>
<IconButton
aria-label="Toggle Dark Mode"
m="8"
size="md"
alignSelf="flex-end"
/>
</VStack>
)
}
准备标题和输入框
import React, { useState } from 'react'
import {
Input,
VStack,
HStack,
IconButton,
Heading
} from '@chakra-ui/react'
import { FiSearch } from 'react-icons/fi'
export default function Dashboard ( ) {
const [result, setResult] = useState('')
const [value, setValue] = useState('')
return (
<VStack>
<IconButton
aria-label="Toggle Dark Mode"
m="8"
size="md"
alignSelf="flex-end"
/>
<Heading mb="8" size="xl">
Search your city
</Heading>
<HStack>
<Input
type="text"
placeholder="Enter city name"
value={result}
onChange={(event) => setResult(event.target.value)}
/>
<IconButton
aria-label="Search city button"
icon={<FiSearch />}
onClick={() => {
setValue(result)
getWeather()
//Errormessage()
}}
>
Search
</IconButton>
</HStack>
</VStack>
)
}
完成输入字段的创建。记录输入字段中的数据到控制台日志,并确认状态是否正常工作。
* 如果发生任何错误,请查看下面的GitHub存储库。
3. 请求的处理 de
为了操作API,需要在应用程序中安装一个用于配置GraphQL的包。
安装以下包。
npm install graphql @apollo/client
就像将ChakraProvider输入App组件一样,也要将处理GraphQL请求的App输入。
将src/components目录中的App.js文件更改如下。
import React from 'react'
import { ApolloClient, ApolloProvider, InMemoryCache } from '@apollo/client'
import Dashboard from './Dashboard'
export default function App() {
const client = new ApolloClient({
cache: new InMemoryCache(),
uri: 'https://graphql-weather-api.herokuapp.com/',
})
return (
<ApolloProvider client={client}>
<Dashboard />
</ApolloProvider>
)
}
在这里我们定义了一个常数,并且输入两个参数(缓存和URI)来初始化Apollo客户端。
※ URI参数是默认的API端点,在这里使用,缓存是为了防止应用程序向相同的数据发送不必要的请求。
接下来,创建一个名为Queries.js的新文件。将该文件创建在一个名为src/components/graphql的不同目录中。该文件将存储之前在Playground中创建的查询语句。
import { gql } from '@apollo/client'
export const GET_WEATHER_QUERY = gql`
query getCityByName($name: String!) {
getCityByName(name: $name) {
name
country
weather {
summary {
title
description
}
temperature {
actual
feelsLike
}
wind {
speed
}
}
}
}
如果要传递城市的名称,请将其传递给输入字段中的 $name。
如果您想详细了解GraphQL的模式类型,请查阅以下文件。
向API端点发送请求并将其响应记录到日志中。
打开Dashboard.js文件,并进行以下更改。
import { useLazyQuery } from '@apollo/client'
import { GET_WEATHER_QUERY } from '../graphql/Queries'
export default function Dashboard ( ) {
const [getWeather, { loading, data, error }] = useLazyQuery(
GET_WEATHER_QUERY,
{
variables: { name: value },
}
)
// Search button for input field
<IconButton
aria-label="Search city button"
icon={<FiSearch />}
onClick={() => {
setValue(result)
getWeather()
}}
>
Search
</IconButton>
}
当按钮被点击时,会触发两个事件。其中一个是使用先前定义的setValue()状态和getWeather()函数,通过这些,请求会被发送并获取到响应,然后存储在data变量中。
数值的状态将传递给之前在src/components/graphql/Queries.js文件中定义的name属性。通过执行console.log(data),您应该能够查看从API端点返回的响应。
4. 使用响应将其显示在前端界面上。
从终点返回的响应是使用之前在data变量中获取的对象,这里需要在前端以精细化的表格形式显示响应。在这里,我们将使用Chakra Ui的Table组件。
当你迷茫时,请参考 Chakra UI 的文档。
导入以下组件。
import {
Stack,
Table,
Tbody,
Tr,
Td,
TableCaption,
StackDivider,
HStack,
Divider,
} from '@chakra-ui/react'
// Dashboard component
<Stack>
<Divider mt="4" mb="4" borderColor="gray.100" />
{data && (
<>
<VStack
divider={<StackDivider />}
borderColor="gray.100"
borderWidth="2px"
p="4"
borderRadius="lg"
w="100%"
maxW={{ base: '90vw', sm: '80vw', lg: '50vw', xl: '40vw' }}
alignItems="stretch"
>
<Table variant="simple">
<TableCaption>
Weather in {data.getCityByName.name} right now
</TableCaption>
<Tbody>
<Tr>
<Td>Temperature</Td>
<Td textAlign="right">
{Math.floor(
data.getCityByName.weather.temperature.actual - 273
) + ' '}
Deg C
</Td>
</Tr>
<Tr>
<Td>Feels like</Td>
<Td textAlign="right">
{data.getCityByName.weather.summary.description}
</Td>
</Tr>
<Tr>
<Td>Wind speed (mph)</Td>
<Td textAlign="right">
{data.getCityByName.weather.wind.speed + ' '}
</Td>
</Tr>
</Tbody>
</Table>
</VStack>
</>
)}
</Stack>
最重要的是能够获取来自响应的数据,并且默认情况下,将从响应中返回的开尔文单位通过公式 – 温度(开尔文)-273 = 温度(摄氏度) 来转换为摄氏度。
5. 使用ChakraUI显示加载状态并启用暗黑模式。
当编写从GraphQL服务器获取请求的逻辑时,可以利用拆封(destructure)变量loading的状态来判断获取请求的进程是否正在进行中。在这种情况下,可以使用Chakra UI的Spinner组件。
以下是顯示旋轉器的邏輯。
import { spinner } from "@chakra-ui/react"
// Dashboard.js component
<Stack>
{loading && (
<>
<Spinner
thickness="4px"
speed="0.65s"
emptyColor="gray.200"
color="blue.500"
size="xl"
/>
</>
)}
</Stack>
使用算子时,只有在读取状态为true的情况下才会显示旋转组件。
那么,让我们启用应用程序的暗黑模式。
转到Dashboard.js文件,使暗模式切换按钮生效。
import { useColorMode } from "@chakra-ui/react
// for the icon to change on toggle -
// if light: show Moon Icon else show Sun Icon
import { FiMoon, FiSun } from 'react-icons/fi'
const { colorMode, toggleColorMode } = useColorMode()
// toggle button for dark/light mode
<IconButton
aria-label="Toggle Dark Mode"
icon={colorMode === 'light' ? <FiMoon /> : <FiSun />}
m="8"
size="md"
alignSelf="flex-end"
onClick={toggleColorMode}
/>
当用户点击按钮时,toggleColorMode将被调用,这将导致colorMode的状态发生变化,并根据三元运算符来改变图标。现在,可以自由地使用Weather应用程序了。
用于建设项目的资源
请参考以下网站。
使用GraphQL和Chakra UI构建一个天气应用程序
GraphQL是什么?介绍与REST的区别和实施案例