ArkUI組件使用
這里會詳細演示以下組件使用:
- Image
- Text
- TextInput
- Button
- Slider
- Column&&Row
- List
- 自定義組件以及相關函數使用
Image
可以是網絡圖片、可以是本地圖片、也可以是像素圖
Image("https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2").width(200).interpolation(ImageInterpolation.High)
加載網絡圖片真機上需要申請網絡訪問權限: 在module.json5
文件中module對象中編寫
"requestPermissions": [{"name": "ohos.permission.INTERNET"}],
這樣真機才能加載網絡圖片
Text
用于顯示文本,支持直接填寫、也支持讀取本地資源文件(用于多語言)
TextInput
輸入框,通過設置
type
屬性可以是密碼輸入框、數字輸入框、文本輸入框等
- Normal:基本輸入
- Password:密碼輸入
- Email: 郵箱輸入
- Number:數字輸入 -PhoneNumber: 電話號碼輸入
通過onChange
事件可以實現自己想要的交互
Button
按鈕,通過設置
type
屬性可以是不同的按鈕類型
- Capsule:膠囊性
- Circle: 圓形
- Normal:普通按鈕
Slider
滑塊組件使用
通過上方屬性可以進行配置使用,在onChange方法內可以實現自己的交互
Column&&Row布局
通過這個可以實現位置布局
justifyContent
:設置子元素在主軸方向的對齊格式alignItem
:設置子元素在交叉軸方向的對齊格式
Column
Row
布局案例(控制圖片大小)
Divider
分割線
@Entry
@Component
struct Index {@State imageWidth: number = 30build() {Column() {Row(){Image("https://i2.hdslb.com/bfs/archive/6c8d928748fcfa5b3366d141f7f3b08008fdd416.jpg@672w_378h_1c_!web-home-common-cover.webp").width(this.imageWidth).interpolation(ImageInterpolation.High)}.width('100%').height(400).justifyContent(FlexAlign.Center)Row(){Text($r('app.string.width_label')).fontSize(30).fontWeight('bold')TextInput({placeholder:"請輸入圖片寬度",text:this.imageWidth.toString()}).width(200).backgroundColor("red").type(InputType.Number).onChange(value=>{this.imageWidth=parseInt(value)})}.width("100%").padding({left:14,right:14}).justifyContent(FlexAlign.SpaceBetween)Divider().width("91%").margin(20)Row(){Button('縮小').width(80).fontSize(20).onClick(()=>{this.imageWidth-=5;})Button('放大').width(80).fontSize(20).onClick(()=>{this.imageWidth+=5;})}.justifyContent(FlexAlign.SpaceEvenly).width('100%')Divider().width("91%").margin(20)Slider({min:100,max:300,value:this.imageWidth,step:10}).width("100%").blockColor("red").trackThickness(8).showTips(true).onChange(val=>{this.imageWidth=val})}.width('100%').height('100%')}
}
List
列表組件,超出可滾動組件
- 使用之前了解一下
渲染控制
- forEach
- if-else
通過以上可遍歷多個item展示,不通過
list
無法超出滾動 以下通過List
修飾實現一個訂單列表(通過if-else決定條件渲染):
private items:Array<ItemList>=[new ItemList('華為Mate60','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',99),new ItemList('華為Mate61','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',199,20),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39)]build() {Column() {//頭部Row(){Text("商品列表").fontSize(30).fontWeight("bold")}.width('100%').height(30).margin({bottom:20})List({space:8}){ForEach(this.items,(item: ItemList)=>{ListItem() {Row({space:10}){Image(item.image).width(100)Column({space:4}){if(item.discount){Text(item.name).fontSize(20).fontWeight('bold')Text(`原價:¥${item.price}`).fontSize(14).fontColor('#CCC').decoration({type:TextDecorationType.LineThrough})Text(`折扣價:¥${item.price-item.discount}`).fontSize(18).fontWeight('bold').fontColor('red')Text(`補貼:¥${item.discount}`).fontSize(18).fontColor('red')}else{Text(item.name).fontSize(20).fontWeight('bold')Text(`¥${item.price}`).fontSize(18).fontColor('red')}}.height('100%').alignItems(HorizontalAlign.Start)}.width("100%").backgroundColor('#FFF').borderRadius(20).height(120).padding(10).borderRadius(10 ).margin(20)}})}.width("100%").layoutWeight(1)}.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)}
}
自定義組件以及相關函數使用
將上方示例進行拆解實現組件封裝~
1.將頂部欄進行封裝,新建文件進行編寫,或者在內部編寫封裝,這里我封裝成公用的
@Component
export struct Header{private title:ResourceStrbuild(){Row(){Text('返回').fontSize(25)Text(this.title).fontSize(30).fontWeight("bold")Blank()Text('刷新').fontSize(25).fontWeight('bold')}.width('100%').height(30)}
}
使用:
import {Header} from "../components/Headers"
引入直接使用即可 再將列表封裝,這里就直接封裝成自定義構建函數
//全局自定義構建函數
@Builder function ItemCard(item:ItemList){Row({space:10}){Image(item.image).width(100)Column({space:4}){if(item.discount){Text(item.name).fontSize(20).fontWeight('bold')Text(`原價:¥${item.price}`).fontSize(14).fontColor('#CCC').decoration({type:TextDecorationType.LineThrough})Text(`折扣價:¥${item.price-item.discount}`).fontSize(18).fontWeight('bold').fontColor('red')Text(`補貼:¥${item.discount}`).fontSize(18).fontColor('red')}else{Text(item.name).fontSize(20).fontWeight('bold')Text(`¥${item.price}`).fontSize(18).fontColor('red')}}.height('100%').alignItems(HorizontalAlign.Start)}.width("100%").backgroundColor('#FFF').borderRadius(20).height(120).padding(10).borderRadius(10 ).margin(20)
}
再封裝個全局的公共樣式函數
//全局公共樣式函數
@Styles function fillScreen(){.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)
}
最后整合代碼
class ItemList{name:stringimage: ResourceStrprice: numberdiscount: numberconstructor(name:string,image: ResourceStr,price:number,discount:number=0) {this.name=namethis.image=imagethis.price=pricethis.discount=discount}
}
import {Header} from "../components/Headers"//全局自定義構建函數
@Builder function ItemCard(item:ItemList){Row({space:10}){Image(item.image).width(100)Column({space:4}){if(item.discount){Text(item.name).fontSize(20).fontWeight('bold')Text(`原價:¥${item.price}`).fontSize(14).fontColor('#CCC').decoration({type:TextDecorationType.LineThrough})Text(`折扣價:¥${item.price-item.discount}`).fontSize(18).fontWeight('bold').fontColor('red')Text(`補貼:¥${item.discount}`).fontSize(18).fontColor('red')}else{Text(item.name).fontSize(20).fontWeight('bold')Text(`¥${item.price}`).fontSize(18).fontColor('red')}}.height('100%').alignItems(HorizontalAlign.Start)}.width("100%").backgroundColor('#FFF').borderRadius(20).height(120).padding(10).borderRadius(10 ).margin(20)
}
//全局公共樣式函數
@Styles function fillScreen(){.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)
}
@Entry
@Component
struct ItemPage {private items:Array<ItemList>=[new ItemList('華為Mate60','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',99),new ItemList('華為Mate61','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',199,20),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39),new ItemList('華為Mate62','https://ts1.cn.mm.bing.net/th?id=OIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2',39)]build() {Column() {//頭部Header({title:"商品列表"}).margin({bottom:20})List({space:8}){ForEach(this.items,(item: ItemList)=>{ListItem() {ItemCard(item)}})}.width("100%").layoutWeight(1)}.fillScreen()}
}
這樣即可實現組件式開發,學過前端的基本都有這樣的概念
總結自定義組件使用
通過以上內容即可學會
ArkUI
組件的基本使用了。
為了能讓大家更好的學習鴻蒙 (Harmony OS) 開發技術,這邊特意整理了《鴻蒙 (Harmony OS)開發學習手冊》(共計890頁),希望對大家有所幫助:https://qr21.cn/FV7h05
《鴻蒙 (Harmony OS)開發學習手冊》
入門必看:https://qr21.cn/FV7h05
- 應用開發導讀(ArkTS)
- 應用開發導讀(Java)
HarmonyOS 概念:https://qr21.cn/FV7h05
- 系統定義
- 技術架構
- 技術特性
- 系統安全
如何快速入門:https://qr21.cn/FV7h05
- 基本概念
- 構建第一個ArkTS應用
- 構建第一個JS應用
- ……
開發基礎知識:https://qr21.cn/FV7h05
- 應用基礎知識
- 配置文件
- 應用數據管理
- 應用安全管理
- 應用隱私保護
- 三方應用調用管控機制
- 資源分類與訪問
- 學習ArkTS語言
- ……
基于ArkTS 開發:https://qr21.cn/FV7h05
- Ability開發
- UI開發
- 公共事件與通知
- 窗口管理
- 媒體
- 安全
- 網絡與鏈接
- 電話服務
- 數據管理
- 后臺任務(Background Task)管理
- 設備管理
- 設備使用信息統計
- DFX
- 國際化開發
- 折疊屏系列
- ……