HarmonyOS全栈开发指南:从入门到精通,构建万物智联的未来生态(四)
四、UI开发体系
16. ArkUI声明式语法与类Web开发范式
4.1.1 ArkUI简介
ArkUI是HarmonyOS提供的一套用于构建跨平台用户界面的声明式开发框架。它借鉴了现代前端框架的设计理念,通过声明式的方式描述UI界面,使得开发者可以更加专注于业务逻辑的实现,而不是UI的渲染细节。ArkUI支持两种开发范式:eTS(Enhanced TypeScript)和JS UI框架,其中eTS是推荐的开发范式,它提供了更强的类型检查和更好的开发体验。
4.1.2 声明式语法基础
声明式语法的核心思想是“描述状态,而不是操作”。在ArkUI中,开发者通过描述UI组件的状态和属性,框架会自动根据这些状态渲染出相应的UI界面。例如,定义一个简单的按钮组件:
typescript复制代码
@Entry | |
@Component | |
struct MyButton { | |
build() { | |
Button('Click Me') | |
.onClick(() => { | |
console.log('Button clicked!'); | |
}); | |
} | |
} |
在这个例子中,Button
组件的文本和点击事件处理函数都是通过声明式语法定义的。当按钮被点击时,框架会自动调用指定的处理函数。
4.1.3 类Web开发范式
ArkUI借鉴了Web开发中的许多概念,如组件、样式、事件等。这使得有过Web开发经验的开发者可以更快地上手ArkUI。
- 组件:ArkUI提供了丰富的内置组件,如文本、按钮、列表、图片等。开发者可以通过组合这些组件来构建复杂的UI界面。
- 样式:ArkUI支持通过CSS样式表或内联样式来定义组件的样式。样式可以包括颜色、字体、边距、填充等。
- 事件:ArkUI支持事件监听和处理机制,如点击事件、触摸事件、键盘事件等。开发者可以通过监听这些事件来实现用户交互。
4.1.4 实战案例:构建一个简单的待办事项列表
下面是一个使用ArkUI构建简单待办事项列表的示例:
typescript复制代码
@Entry | |
@Component | |
struct TodoList { | |
private todos: string[] = ['Buy groceries', 'Do laundry', 'Call mom']; | |
@Builder todoItem(todo: string) { | |
Row() { | |
Text(todo) | |
.width('100%') | |
.textAlign(TextAlign.Left); | |
Button('Delete') | |
.onClick(() => { | |
this.todos = this.todos.filter(item => item !== todo); | |
}); | |
}.padding(10); | |
} | |
build() { | |
List({ space: 20 }) { | |
this.todos.forEach(todo => { | |
this.todoItem(todo); | |
}); | |
} | |
} | |
} |
在这个例子中,我们定义了一个TodoList
组件,它包含一个待办事项列表。每个待办事项都是一个Row
组件,包含一个Text
组件显示待办事项文本和一个Button
组件用于删除该待办事项。当用户点击删除按钮时,框架会自动调用处理函数从列表中移除该待办事项。
4.1.5 小结
ArkUI的声明式语法和类Web开发范式使得构建跨平台用户界面变得更加简单和高效。通过声明式语法,开发者可以更加专注于业务逻辑的实现;而类Web的开发范式则降低了学习成本,使得有过Web开发经验的开发者可以快速上手ArkUI。在实际开发中,开发者可以结合使用内置组件、样式和事件来构建复杂的UI界面。
17. 布局系统:Flex/Grid/Stack布局实战
4.2.1 Flex布局
Flex布局是一种一维布局模型,它允许容器内的项目能够灵活地伸缩以最佳方式填充可用空间。在ArkUI中,Flex布局是通过Flex
容器组件实现的。
- 容器属性:
direction
(主轴方向)、justify-content
(主轴对齐方式)、align-items
(交叉轴对齐方式)、wrap
(换行策略)等。 - 项目属性:
flex-grow
(放大比例)、flex-shrink
(缩小比例)、flex-basis
(基础大小)等。
实战案例:构建一个水平滚动的图片轮播组件。
typescript复制代码
@Component | |
struct ImageCarousel { | |
private images: string[] = [ | |
'image1.jpg', 'image2.jpg', 'image3.jpg' | |
]; | |
build() { | |
Scroll({ scrollDirection: ScrollDirection.Horizontal }) { | |
Flex({ justifyContent: FlexAlign.SpaceBetween }) { | |
this.images.forEach(image => { | |
Image(image).objectFit(ImageFit.Cover).width('300px').height('200px'); | |
}); | |
} | |
} | |
} | |
} |
4.2.2 Grid布局
Grid布局是一种二维布局模型,它允许开发者将容器划分为网格区域,并将项目放置在这些区域中。在ArkUI中,Grid布局是通过Grid
容器组件实现的。
- 容器属性:
template-columns
(定义列大小)、template-rows
(定义行大小)、gap
(网格间距)等。 - 项目属性:
grid-column
(指定项目所在的列)、grid-row
(指定项目所在的行)等。
实战案例:构建一个产品展示网格。
typescript复制代码
@Component | |
struct ProductGrid { | |
private products: any[] = [ | |
{ name: 'Product 1', image: 'product1.jpg' }, | |
{ name: 'Product 2', image: 'product2.jpg' }, | |
// ... more products | |
]; | |
build() { | |
Grid({ | |
templateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', | |
gap: '20px' | |
}) { | |
this.products.forEach(product => { | |
Column() { | |
Image(product.image).objectFit(ImageFit.Cover).width('100%').height('200px'); | |
Text(product.name).fontSize(16).textAlign(TextAlign.Center).padding({ top: 10 }); | |
}.padding(10).border({ width: 1, color: '#ddd' }); | |
}); | |
} | |
} | |
} |
4.2.3 Stack布局
Stack布局是一种堆叠布局模型,它允许开发者将项目堆叠在一起。在ArkUI中,Stack布局是通过Stack
容器组件实现的。
- 容器属性:无特定属性,但可以通过子组件的
alignment
属性来控制对齐方式。 - 项目属性:
alignment
(对齐方式)、margin
(外边距)等。
实战案例:构建一个带有浮动按钮的卡片组件。
typescript复制代码
@Component | |
struct CardWithFAB { | |
build() { | |
Stack() { | |
Column() { | |
Text('Card Title').fontSize(24).textAlign(TextAlign.Center).padding({ top: 20, bottom: 10 }); | |
Text('Card Content').fontSize(16).textAlign(TextAlign.Center).padding({ bottom: 20 }); | |
}.width('100%').backgroundColor('#fff').borderRadius(10).boxShadow('0 4px 8px rgba(0,0,0,0.1)'); | |
Button('FAB') | |
.backgroundColor('#ff5722') | |
.color('#fff') | |
.width('56px').height('56px') | |
.borderRadius('50%') | |
.position({ bottom: '20px', right: '20px' }) | |
.onClick(() => { | |
console.log('FAB clicked!'); | |
}); | |
} | |
} | |
} |
4.2.4 小结
ArkUI提供了Flex、Grid和Stack三种布局模型,它们分别适用于一维、二维和堆叠布局场景。通过合理使用这些布局模型,开发者可以构建出丰富多样的UI界面。在实际开发中,开发者需要根据具体需求选择合适的布局模型,并结合容器属性和项目属性来实现所需的布局效果。