Game Heading
获取 gameQuery
对象内属性的值来动态渲染标题,需要新建一个组件。
GameHeading.tsx |
---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | import { Heading } from "@chakra-ui/react";
import { GameQuery } from "../App";
interface Props {
gameQuery: GameQuery;
}
const GameHeading = ({ gameQuery }: Props) => {
// 避免出现 undefined,使用或运算符(原来在模板字符串内还可以这样!)
const heading = `${gameQuery.platform?.name || ""} ${
gameQuery.genre?.name || ""
} Games`;
return (
<Heading as="h1" marginY={5} fontSize="5xl">
{heading}
</Heading>
);
};
export default GameHeading;
|
然后添加到 App.tsx
。这里由于标题、卡片和筛选器的左侧间距需要保持一致,因此将这几个组件用 Chakra UI 的 <Box>
组件包裹起来,在该组件上设置 padding
。
App.tsx |
---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 | import { Box, Grid, GridItem, HStack, Show } from "@chakra-ui/react";
import NavBar from "./components/NavBar";
import GameGrid from "./components/GameGrid";
import GenreList from "./components/GenreList";
import { useState } from "react";
import { Genre } from "./hooks/useGenres";
import PlatfromSelector from "./components/PlatfromSelector";
import { Platform } from "./hooks/useGames";
import SortSelector from "./components/SortSelector";
import GameHeading from "./components/GameHeading";
export interface GameQuery {
genre: Genre | null;
platform: Platform | null;
sortOrder: string;
searchText: string;
}
function App() {
const [gameQuery, setGameQuery] = useState<GameQuery>({} as GameQuery);
return (
<Grid
templateAreas={{
base: `"nav" "main"`,
lg: `"nav nav" "aside main"`,
}}
templateColumns={{
base: "1fr",
lg: "250px 1fr",
}}
>
<GridItem area="nav">
<NavBar
onSearch={(searchText) =>
setGameQuery({ ...gameQuery, searchText })
}
/>
</GridItem>
<Show above="lg">
<GridItem area="aside" paddingX={5}>
<GenreList
onSelectGenre={(genre) =>
setGameQuery({ ...gameQuery, genre })
}
selectedGenre={gameQuery.genre}
/>
</GridItem>
</Show>
<GridItem area="main">
<Box paddingLeft={2}>
<GameHeading gameQuery={gameQuery} />
<HStack spacing={5} marginBottom={5}>
<PlatfromSelector
onSelectPlatform={(platform) =>
setGameQuery({ ...gameQuery, platform })
}
selectedPlatform={gameQuery.platform}
/>
<SortSelector
onSelectSortOrder={(sortOrder) =>
setGameQuery({ ...gameQuery, sortOrder })
}
sortOrder={gameQuery.sortOrder}
/>
</HStack>
</Box>
<GameGrid gameQuery={gameQuery} />
</GridItem>
</Grid>
);
}
export default App;
|
2024-09-11 23:39 2024-09-12 00:00