• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 构建食物列表List布局
2
3使用List组件和ForEach循环渲染,构建食物列表布局。
4
5
61. 在pages目录新建页面FoodCategoryList.ets,将index.ets改名为FoodDetail.ets7
82. 新建FoodList组件作为页面入口组件,FoodListItem为其子组件。List组件是列表组件,适用于重复同类数据的展示,其子组件为ListItem,适用于展示列表中的单元。
9   ```ts
10   @Component
11   struct FoodListItem {
12     build() {}
13   }
14
15   @Entry
16   @Component
17   struct FoodList {
18     build() {
19       List() {
20         ListItem() {
21           FoodListItem()
22         }
23       }
24     }
25   }
26   ```
27
283. 引入FoodData类和initializeOnStartup方法。
29
30应用代码中文件访问方法主要有下面两种:
31- **相对路径**:使用相对路径引用代码文件,以"../"访问上一级目录,以"./"访问当前目录,也可以省略不写。
32- **绝对路径**:使用当前模块根路径引用代码文件,比如:common/utils/utils33这里使用相对路径访问:
34
35   ```
36   import { FoodData } from '../model/FoodData'
37   import { initializeOnStartup } from '../model/FoodDataModels'
38   ```
39
404. FoodList和FoodListItem组件数值传递。在FoodList组件内创建类型为FoodData[]成员变量foodItems,调用initializeOnStartup方法为其赋值。在FoodListItem组件内创建类型为FoodData的成员变量foodItem。将父组件foodItems数组的第一个元素的foodItems[0]作为参数传递给FoodListItem。
41   ```ts
42   import { FoodData } from '../model/FoodData'
43   import { initializeOnStartup } from '../model/FoodDataModels'
44
45   @Component
46   struct FoodListItem {
47     private foodItem: FoodData
48     build() {}
49   }
50
51   @Entry
52   @Component
53   struct FoodList {
54     private foodItems: FoodData[] = initializeOnStartup()
55     build() {
56       List() {
57         ListItem() {
58           FoodListItem({ foodItem: this.foodItems[0] })
59         }
60       }
61     }
62   }
63   ```
64
655. 声明子组件FoodListItem 的UI布局。创建Flex组件,包含食物图片缩略图,食物名称,和食物对应的卡路里。
66   ```ts
67   import { FoodData } from '../model/FoodData'
68   import { initializeOnStartup } from '../model/FoodDataModels'
69
70      @Component
71      struct FoodListItem {
72        private foodItem: FoodData
73        build() {
74          Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
75            Image(this.foodItem.image)
76              .objectFit(ImageFit.Contain)
77              .height(40)
78              .width(40)
79              .margin({ right: 16 })
80            Text(this.foodItem.name)
81              .fontSize(14)
82              .flexGrow(1)
83            Text(this.foodItem.calories + ' kcal')
84              .fontSize(14)
85          }
86          .height(64)
87          .margin({ right: 24, left:32 })
88        }
89      }
90
91   @Entry
92      @Component
93      struct FoodList {
94        private foodItems: FoodData[] = initializeOnStartup()
95        build() {
96          List() {
97            ListItem() {
98              FoodListItem({ foodItem: this.foodItems[0] })
99            }
100          }
101        }
102      }
103   ```
104
105
106   ![zh-cn_image_0000001204776353](figures/zh-cn_image_0000001204776353.png)
107
1086. 创建两个FoodListItem。在List组件创建两个FoodListItem,分别给FoodListItem传递foodItems数组的第一个元素this.foodItems[0]和第二个元素foodItem: this.foodItems[1]。
109
110   ```ts
111   import { FoodData } from '../model/FoodData'
112   import { initializeOnStartup } from '../model/FoodDataModels'
113
114   @Component
115   struct FoodListItem {
116     private foodItem: FoodData
117
118     build() {
119       Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
120         Image(this.foodItem.image)
121           .objectFit(ImageFit.Contain)
122           .height(40)
123           .width(40)
124           .margin({ right: 16 })
125         Text(this.foodItem.name)
126           .fontSize(14)
127           .flexGrow(1)
128         Text(this.foodItem.calories + ' kcal')
129           .fontSize(14)
130       }
131       .height(64)
132       .margin({ right: 24, left: 32 })
133     }
134   }
135
136   @Entry
137   @Component
138   struct FoodList {
139     private foodItems: FoodData[] = initializeOnStartup()
140
141     build() {
142       List() {
143         ListItem() {
144           FoodListItem({ foodItem: this.foodItems[0] })
145         }
146
147         ListItem() {
148           FoodListItem({ foodItem: this.foodItems[1] })
149         }
150       }
151     }
152   }
153   ```
154
155
156      ![zh-cn_image1_0000001204776353](figures/zh-cn_image1_0000001204776353.png)
157
1587. 单独创建每一个FoodListItem肯定是不合理的,这就需要引入[ForEach循环渲染](../quick-start/arkts-rendering-control.md#循环渲染)。
159
160   ```ts
161   import { FoodData } from '../model/FoodData'
162   import { initializeOnStartup } from '../model/FoodDataModels'
163
164   @Component
165   struct FoodListItem {
166     private foodItem: FoodData
167     build() {
168       Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
169         Image(this.foodItem.image)
170           .objectFit(ImageFit.Contain)
171           .height(40)
172           .width(40)
173           .margin({ right: 16 })
174         Text(this.foodItem.name)
175           .fontSize(14)
176           .flexGrow(1)
177         Text(this.foodItem.calories + ' kcal')
178           .fontSize(14)
179       }
180       .height(64)
181       .margin({ right: 24, left:32 })
182     }
183   }
184
185   @Entry
186   @Component
187   struct FoodList {
188     private foodItems: FoodData[] = initializeOnStartup()
189     build() {
190       List() {
191         ForEach(this.foodItems, item => {
192           ListItem() {
193             FoodListItem({ foodItem: item })
194           }
195         }, item => item.id.toString())
196       }
197     }
198   }
199   ```
200
2018. 添加FoodList标题。
202
203   ```
204   @Entry
205   @Component
206   struct FoodList {
207     private foodItems: FoodData[] = initializeOnStartup()
208
209     build() {
210       Column() {
211         Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
212           Text('Food List')
213             .fontSize(20)
214             .margin({ left: 20 })
215         }
216         .height('7%')
217         .backgroundColor('#FFf1f3f5')
218
219         List() {
220           ForEach(this.foodItems, item => {
221             ListItem() {
222               FoodListItem({ foodItem: item })
223             }
224           }, item => item.id.toString())
225         }
226         .height('93%')
227       }
228     }
229   }
230   ```
231
232     ![zh-cn_image_0000001169678922](figures/zh-cn_image_0000001169678922.png)