隆重推出 Amplify UI 的 React 组件
2024年6月27日:这篇博文使用的是Amplify Gen 1,如果您要开始使用新的Amplify应用程序,我建议您尝试使用Gen 2!
本周,我在 AWS 的团队推出了 React UI 组件,用它们来构建东西真的很有趣——我想向大家展示一下你可以创造出什么!
AWS Amplify UI 是一套基础组件和云连接组件,支持自定义、主题化和辅助功能。它包含用于创建布局、按钮、标题、评分等的基础组件,以及用于连接 AWS 资源以显示地图和构建身份验证流程的组件。让我们来构建一个使用 UI 库的地图应用程序吧!
启动应用程序
首先,创建一个应用程序——我使用的是 Next.js,但您也可以使用 Create React App。
npx create-next-app amplify-ui-demo
cd amplify-ui-demo
然后,安装 Amplify 库和 UI 组件:
npm i aws-amplify @aws-amplify/ui-react
Amplify UI 默认没有自带字体,您可以选择自己喜欢的字体。默认主题使用 Inter 字体——我们也会在我们的应用中安装该字体。
npm install @fontsource/inter
在应用程序的根目录下/pages/_app.js,导入 Amplify CSS 文件和 inter font:
import "@aws-amplify/ui-react/styles.css";
import "@fontsource/inter/variable.css";
构建基本用户界面
现在,让我们来构建应用程序的基本用户界面!我们将在应用程序的主页上进行操作/pages/index.js。首先,我将在我的 React 组件上方创建一个餐厅数组。每家餐厅都将包含名称、菜系、评分、价格以及(随机生成的)经纬度:
const restaurants = [
{
name: "Mannys's Burgers",
cuisine: "American",
rating: 5,
price: "$$",
location: {
lat: "32.385348495775",
long: "-85.738272191934",
},
},
{
name: "Mac n Cheesy",
cuisine: "American",
rating: 4,
price: "$",
location: {
lat: "40.385358710927",
long: "-78.637760520167",
},
},
{
name: "Giuliano's Italian Restaurant",
cuisine: "Italian",
rating: 5,
price: "$$$",
location: {
lat: "35.396328108119",
long: "-87.786869702867",
},
},
{
name: "The Pink Sheep",
cuisine: "Fine Dining",
rating: null,
price: "$$$$",
rating: 3,
location: {
lat: "45.386348035105",
long: "-97.535870048241",
},
},
];
我还会预先导入所有需要的UI组件,包括Next.js的Link组件。
import {
withAuthenticator,
Card,
Badge,
Heading,
Rating,
Text,
Link,
Flex,
View,
SearchField,
useTheme,
MapView,
} from "@aws-amplify/ui-react";
import NextLink from "next/link";
我们将从一个组件开始,View该组件默认会渲染成一个div<div> 标签。我们将保留 Next.js 代码Head,并在其中添加一个 title 标签。
function Home() {
return (
<View>
<Head>
<title>RestaurantList</title>
</Head>
</View>
);
}
在下方Head,我们来构建一个页眉。首先,我们将View再次使用 `<header>` 组件,但这次我们将它渲染为 ` header<header>` 元素而不是 `<header>` 元素div。我们还会添加一些内边距。然后,我们将使用Flex`<flexbox>` 组件来实现 Flexbox 布局。您可以使用与 Flexbox CSS 属性相对应的 props!我们将使内容在行内居中,并在项目周围添加间距。我们将创建另一个 `<header>` 组件Flex并添加一些Link`<header>` 标签。我们还将添加一个 `<header>` 级别的标题,标题内容1为网站名称。最后,我们将添加另一个 `<header>`Flex组件,并在SearchField其中添加一个 `<header>` 标签。
<View as="header" padding="10px">
<Flex direction="row" justifyContent="space-around" alignItems="center">
<Flex>
<NextLink href="">
<Link>Home</Link>
</NextLink>
<NextLink href="/about">
<Link>About</Link>
</NextLink>
<NextLink href="/shop">
<Link>Shop</Link>
</NextLink>{" "}
</Flex>
<Heading level={1} textAlign="center">
RestaurantList
</Heading>
<Flex>
<SearchField />
</Flex>
</Flex>
</View>
接下来,我们遍历所有餐厅,并Card为每家餐厅添加一个组件。我们将Flex在这里创建一个组件,以便将来可以在卡片旁边显示地图。然后,我们将添加一个View包含集合的组件maxWidth。我们将遍历所有餐厅,并Card为每家餐厅创建一个组件。每个组件的Card左侧将包含餐厅信息,右侧将包含评分。该Rating组件将渲染每家餐厅的星级评分!
<Flex>
<View maxWidth="800px">
{restaurants.map((restaurant) => (
<Card variation="elevated" key={restaurant.name} margin="10px">
<Flex direction="row" justifyContent="space-between">
<Flex direction="column">
<Heading level={3}>{restaurant.name}</Heading>
<Badge size="large" variation="info" width="fit-content">
{restaurant.cuisine}
</Badge>
<Text color="grey">{restaurant.price}</Text>
</Flex>
<Flex direction="column">
<Rating value={restaurant.rating} maxValue={5} />
</Flex>
</Flex>
</Card>
))}
</View>
</Flex>
现在你的用户界面应该看起来像这样:
主题
Amplify UI 完全支持主题定制——您可以让组件完全符合您的品牌或风格。Amplify UI 文档中提供了一些示例主题,可以彻底改变 UI 的外观!
在这种情况下,我会更改一些颜色。我将使用绿色作为主主题色,黄色作为辅助色。我会将主题对象添加到文件中_app.js。Amplify UI 内置了颜色,绿色和黄色就是从这里来的,但您也可以将这些值设置为完全自定义的颜色。
const earthyTheme = {
name: "earthTheme",
tokens: {
colors: {
brand: {
primary: {
10: { value: "{colors.green.10}" },
20: { value: "{colors.green.20}" },
40: { value: "{colors.green.40}" },
60: { value: "{colors.green.60}" },
80: { value: "{colors.green.80}" },
90: { value: "{colors.green.90}" },
100: { value: "{colors.green.100}" },
},
secondary: {
10: { value: "{colors.yellow.10}" },
20: { value: "{colors.yellow.20}" },
40: { value: "{colors.yellow.40}" },
60: { value: "{colors.yellow.60}" },
80: { value: "{colors.yellow.80}" },
90: { value: "{colors.yellow.90}" },
100: { value: "{colors.yellow.100}" },
},
},
},
},
};
要使用该主题,请导入ThemeProvider组件。
import { ThemeProvider } from "@aws-amplify/ui-react";
然后,将顶层应用程序组件包裹在内,ThemeProvider并将theme属性设置传递给主题对象。
function MyApp({ Component, pageProps }) {
return (
<ThemeProvider theme={earthyTheme}>
<Component {...pageProps} />
</ThemeProvider>
);
}
在组件中使用主题
您还可以直接在组件中使用主题属性来设置组件样式。在Home组件内部index.js,使用useTheme钩子函数。
const { tokens } = useTheme();
接下来,我们将页眉的背景颜色设置为主题的主色:
<View as="header" padding="10px" backgroundColor={tokens.colors.brand.primary[40]}>
如果品牌主色在未来发生变化,页眉也会随之更新!
云连接组件
Amplify UI 还提供云连接组件,以便您可以直接从 React 组件连接到 AWS 服务。首先,请安装 Amplify CLI。如果您是第一次使用 Amplify,则还需要对其进行配置。
npm install -g @aws-amplify/cli
然后,在项目中初始化 Amplify:
amplify init
出现提示时,请为您的项目选择一个名称,然后选择“是”以使用默认值进行初始化。同时,请选择您的 AWS 配置文件。
现在,运行以下命令为您的项目添加身份验证:
amplify add auth
按回车键进入默认配置,然后选择用户名和“不,我完成了”。
然后将地图功能添加到您的应用中:
amplify add geo
请按以下方式回答问题(地图名称可随意选择):
? Select which capability you want to add: Map (visualize the geospatial data)
✔ Provide a name for the Map: · map53122572
✔ Who can access this Map? · Authorized and Guest users
Available advanced settings:
- Map style & Map data provider (default: Streets provided by Esri)
✔ Do you want to configure advanced settings? (y/N) · no
运行amplify push以部署资源。
接下来,您需要在应用程序代码中配置 Amplify。在./pages/_app.js文件中添加以下内容:
import awsExports from "../src/aws-exports";
import { Amplify } from "aws-amplify";
Amplify.configure(awsExports);
我们先来给应用添加一个地图组件。在餐厅卡片的 `<head> Flex` 标签内,并在 `<body>` 标签的结束位置下方,</View>添加一个 `<map>` 标签MapView。经纬度指的是美国,您可以根据需要调整缩放级别。
<MapView
initialViewState={{
latitude: "37.0902",
longitude: "-95.7129",
zoom: 4,
}}
></MapView>
我们还要为每家餐厅添加标记。我们将使用react-map-gl这些标记。
安装软件包:
npm i react-map-gl
导入标记:
import { Marker } from "react-map-gl";
然后,在 MapView 标签内渲染Markers。
{
restaurants.map((restaurant) => (
<Marker
key={restaurant.name}
latitude={restaurant.location.lat}
longitude={restaurant.location.long}
/>
));
}
现在你就有地图了!
现在我们来添加身份验证流程,以便用户需要登录才能查看地图。将 Home 组件包裹在高阶withAuthenticator组件中。现在系统会提示您创建用户并登录!
export default withAuthenticator(Home);
您还可以使用Amplify 的数据类别来使用数据库数据而不是 JavaScript 对象。
工作室
您还可以使用 Amplify Studio 将 Figma 设计稿转换为云端代码。底层生成的组件都将使用 Amplify UI。请查看此教程,了解如何使用该工作流程构建类似的应用程序。
结论
在本教程中,我们使用 Amplify UI 的基本组件和云连接组件构建了一个用户界面。如果您想断开应用与云端的连接并删除身份验证和地理位置资源,请运行以下amplify delete命令。在使用 Amplify UI 进行构建的过程中,我们非常期待您的反馈!



