0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙ArkUI:【編程范式:命令式->聲明式】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-13 16:32 ? 次閱讀

命令式

簡(jiǎn)單講就是需要開(kāi)發(fā)用代碼一步一步進(jìn)行布局,這個(gè)過(guò)程需要開(kāi)發(fā)全程參與。
開(kāi)發(fā)前請(qǐng)熟悉鴻蒙開(kāi)發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

  • Objective-C
ObjectiveC
復(fù)制代碼
UIView *cardView = [[UIView alloc] init];
cardView.backgroundColor = [UIColor whiteColor];
cardView.layer.cornerRadius = 16;
cardView.clipsToBounds = YES;
[self.view addSubview:cardView];
[cardView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(16);
    make.right.mas_offset(-16);
    make.height.mas_equalTo(116);
    make.top.mas_equalTo(100);
}];
    
NSString *imgUrl = @"https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg";
UIImageView *imgView = [[UIImageView alloc] init];
imgView.backgroundColor = [UIColor lightGrayColor];
[imgView sd_setImageWithURL:[NSURL URLWithString:imgUrl]];
[cardView addSubview:imgView];
[imgView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.bottom.mas_offset(0);
    make.left.mas_equalTo(0);
    make.width.mas_equalTo(107);
}];

UILabel *titleLbl = [[UILabel alloc] init];
titleLbl.font = [UIFont systemFontOfSize:14 weight:UIFontWeightBold];
titleLbl.textColor = [UIColor blackColor];
titleLbl.text = @"萬(wàn)柳書(shū)院新一區(qū) 南北向滿五唯一";
[cardView addSubview:titleLbl];
[titleLbl mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(imgView.mas_right).mas_offset(12);
    make.right.mas_offset(-12);
    make.top.mas_equalTo(16);
}];

UILabel *subTitleLbl = [[UILabel alloc] init];
subTitleLbl.textColor = [UIColor blackColor];
subTitleLbl.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular];
subTitleLbl.text = @"4室2廳/278.35㎡/南 北/萬(wàn)柳書(shū)院";
[cardView addSubview:subTitleLbl];
[subTitleLbl mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.right.mas_equalTo(titleLbl);
    make.top.mas_equalTo(titleLbl.mas_bottom).mas_offset(8);
}];

UILabel *priceLbl = [[UILabel alloc] init];
priceLbl.font = [UIFont systemFontOfSize:14 weight:UIFontWeightBold];
priceLbl.textColor = [UIColor redColor];
priceLbl.text = @"4238萬(wàn)";
[cardView addSubview:priceLbl];
[priceLbl mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(titleLbl);
    make.bottom.mas_offset(-16);
}];

UILabel *avgPriceLbl = [[UILabel alloc] init];
avgPriceLbl.textColor = [UIColor lightGrayColor];
avgPriceLbl.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular];
avgPriceLbl.text = @"155,445元/平";
[cardView addSubview:avgPriceLbl];
[avgPriceLbl mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(priceLbl.mas_right).mas_offset(2);
    make.right.mas_lessThanOrEqualTo(titleLbl.mas_right);
    make.bottom.mas_equalTo(priceLbl);
}];

聲明式

聲明式則是由開(kāi)發(fā)使用語(yǔ)言描述UI頁(yè)面長(zhǎng)什么樣子,之后全權(quán)交給引擎去做

  1. 對(duì)頁(yè)面結(jié)構(gòu)進(jìn)行大的拆解。比如上面卡片分左右兩大部分
  2. 選用合適的容器組件進(jìn)行頁(yè)面描述
  3. 針對(duì)拆解出來(lái)的每個(gè)部分重復(fù)上面的兩步,直到無(wú)法拆解只能使用基本組件描述為止

比如上面的卡片可以進(jìn)行如下的拆分

  1. 整體是一個(gè)Row容器,分為左右兩大部分,左邊是圖片,右邊是一個(gè)Column容器
  2. 右邊Column容器又拆分為兩大部分,上面是標(biāo)題和描述,下面是價(jià)格。兩部分按照space-between布局
  3. 上面的標(biāo)題和描述作為一個(gè)整體,里面拆分成Column的兩個(gè)組件
  4. 下面價(jià)格可以直接使用系統(tǒng)組件Text

ReactNative

TypeScript
復(fù)制代碼
 View
  style={{
    borderRadius: 8,
    marginHorizontal: 16,
    flexDirection: 'row',
    backgroundColor: 'white',
    overflow: 'hidden',
    height: 116,
  }} >
   Image
    source={{
      uri: 'https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg',
    }}
    style={{width: 107, backgroundColor: '#eee'}}
  / >
   View
    style={{
      marginVertical: 16,
      marginHorizontal: 12,
      flex: 1,
      justifyContent: 'space-between',
    }} >
     View >
       Text style={{fontSize: 14, color: '#222', fontWeight: '500'}} >
        萬(wàn)柳書(shū)院新一區(qū) 南北向滿五唯一
       /Text >
       Text style={{fontSize: 11, color: '#222', marginTop: 8}} >
        4室2廳/278.35㎡/南 北/萬(wàn)柳書(shū)院
       /Text >
     /View >
     View
      style={{flexDirection: 'row', marginTop: 8, alignItems: 'flex-end'}} >
       Text
        style={{
          fontSize: 17,
          color: '#E62222',
          fontWeight: 'bold',
        }} >
        4238萬(wàn)
       /Text >
       Text style={{fontSize: 11, color: '#999', marginLeft: 6}} >
        155,445元/平
       /Text >
     /View >
   /View >
 /View >

Flutter

flutter
復(fù)制代碼

SwiftUI

swift
復(fù)制代碼
HStack(spacing:0) {
    AsyncImage(url: URL(string: "https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg"))
        .frame(width:107)
        .aspectRatio(contentMode: .fill)
        .clipped()

    VStack(alignment: .leading,
           spacing:0) {
        VStack(alignment: .leading,
               spacing:0) {
            Text("萬(wàn)柳書(shū)院新一區(qū) 南北向滿五唯一")
                .lineLimit(1)
                .font(.system(size: 14))
                .foregroundColor(.black)
                .fontWeight(.bold)
            Text("4室2廳/278.35㎡/南 北/萬(wàn)柳書(shū)院")
                .lineLimit(1)
                .font(.system(size: 12))
                .foregroundColor(.black)
                .padding(.top, 8)
        }

        Spacer()

        HStack(alignment: .bottom,
               spacing:2) {
            Text("4238萬(wàn)")
                .font(.system(size: 14))
                .foregroundColor(.red)
                .fontWeight(.bold)
            Text("155,445元/平")
                .font(.system(size: 12))
                .foregroundColor(.secondary)
                .padding(.leading, 2)
        }
    }
           .padding(.vertical, 16)
           .padding(.horizontal, 12)

    Spacer()
}
.frame(height: 116)
.background(.white)
.clipShape(RoundedRectangle(cornerRadius: 8))
.padding(.horizontal, 16)
}

ArkUI

typescript
復(fù)制代碼
  Row() {
    Row() {
      Image("https://ke-image.ljcdn.com//110000-inspection//pc1_nBllrJgGj_1.jpg.280x210.jpg")
        .width(107)
        .height("100%")
        .objectFit(ImageFit.Cover)
      Column() {
        Column() {
          Text("柳書(shū)院新一區(qū) 南北向滿五唯一")
            .fontSize(16)
            .fontColor("#222")
            .maxLines(1)
          Text("4室2廳/278.35㎡/南 北/萬(wàn)柳書(shū)院")
            .fontSize(14)
            .fontColor("#222")
            .maxLines(1)
            .margin({ top: 8 })
        }
        .alignItems(HorizontalAlign.Start)

        Row() {
          Text("4238萬(wàn)")
            .fontSize(15)
            .fontColor("#E62222") 
            .fontWeight(FontWeight.Bold)
          Text("155,445元/平")
            .fontSize(13)
            .fontColor("#222")
            .margin({ left: 2 })
        }
        .justifyContent(FlexAlign.Start)
        .alignItems(VerticalAlign.Bottom)
      }
      .width("100%")
      .height("100%")
      .padding({ top: 16, bottom: 16, left: 12, right: 12 })
      .alignItems(HorizontalAlign.Start)
      .justifyContent(FlexAlign.SpaceBetween)
    }
    .borderRadius(8)
    .margin({ left: 16, right: 16 })
    .backgroundColor(Color.White)
    .justifyContent(FlexAlign.Start)
    .clip(true)
  }
  .height(116)
  .width("100%")
  
`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

搜狗高速瀏覽器截圖20240326151547.png

小結(jié)

  1. 從上面的例子可以看出來(lái),聲明式語(yǔ)法只需要我們描述UI長(zhǎng)什么樣就行。不需要做太多布局計(jì)算的工作,讓我們少掉一些頭發(fā)
  2. ArkUI和SwiftUI的語(yǔ)法最像,甚至它們的狀態(tài)管理也很像,都是提供了狀態(tài)綁定和監(jiān)聽(tīng)機(jī)制來(lái)更新UI樣式

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開(kāi)發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    360

    瀏覽量

    40771
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4697

    瀏覽量

    68085
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2291

    瀏覽量

    42632
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙:我來(lái)了!安卓:那我走?

    (簡(jiǎn)稱TS)/JavaScript(簡(jiǎn)稱JS)為主要編程語(yǔ)言的聲明UI框架(ArkUI 3.0)。同時(shí),ArkCompiler 3.0增加了對(duì)TS/JS語(yǔ)言的支持,HarmonyOS
    發(fā)表于 11-05 15:51

    HarmonyOS應(yīng)用開(kāi)發(fā)-ArkUI聲明UI工程體驗(yàn)與分享

    聲明UI工程體驗(yàn)1. 創(chuàng)建工程說(shuō)明:聲明UI工程目前僅在API7才能使用 選擇 選擇eTS語(yǔ)言 創(chuàng)建完成后,這是該目錄,其中common目錄和model目錄需要自行創(chuàng)建即
    發(fā)表于 12-08 10:22

    HarmonyOS應(yīng)用開(kāi)發(fā)-ArkUI聲明UI頁(yè)面布局、跳轉(zhuǎn)與返回的實(shí)現(xiàn)

    頁(yè)面跳轉(zhuǎn)聲明UI范式提供了兩種機(jī)制來(lái)實(shí)現(xiàn)頁(yè)面間的跳轉(zhuǎn):1. 路由容器組件Navigator,包裝了頁(yè)面路由的能力,指定頁(yè)面target后,使其包裹的子組件都具有路由能力。2. 路由
    發(fā)表于 12-09 11:42

    課程預(yù)告丨12月15日官方直播帶你領(lǐng)略ArkUI聲明開(kāi)發(fā)范式之美

    方舟開(kāi)發(fā)框架(ArkUI)的聲明開(kāi)發(fā)范式有什么優(yōu)勢(shì)?Java/JS/eTS(extended TypeScript)三種語(yǔ)言,用哪種語(yǔ)言更好?12月15日 19:00-20:30,H
    發(fā)表于 12-10 17:52

    Hello HarmonyOS學(xué)習(xí)筆記:分布新聞客戶端實(shí)戰(zhàn)(JS、eTS)

    開(kāi)發(fā)框架(ArkUI),其中JAVA UI框架是基于Java拓展的命令開(kāi)發(fā),方舟開(kāi)發(fā)框架是基于JS拓展的類Web開(kāi)發(fā)范式(俗稱響應(yīng))或T
    發(fā)表于 06-23 20:08

    4天帶你上手HarmonyOS ArkUI開(kāi)發(fā)——《HarmonyOS ArkUI入門(mén)訓(xùn)練營(yíng)之健康生活實(shí)戰(zhàn)》

    開(kāi)發(fā)者快速提升技能實(shí)力進(jìn)階。目標(biāo)學(xué)員入門(mén)開(kāi)發(fā)者(計(jì)算機(jī)專業(yè)相關(guān))學(xué)習(xí)鏈接:https://t.elecfans.com/c2241.html訓(xùn)練營(yíng)目標(biāo)通過(guò)學(xué)習(xí)ArkUI入門(mén)訓(xùn)練營(yíng)課程,了解聲明UI開(kāi)發(fā)
    發(fā)表于 01-05 11:49

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-ArkTS的聲明開(kāi)發(fā)范式

    基于ArkTS的聲明開(kāi)發(fā)范式的方舟開(kāi)發(fā)框架是一套開(kāi)發(fā)極簡(jiǎn)、高性能、跨設(shè)備應(yīng)用的UI開(kāi)發(fā)框架,支持開(kāi)發(fā)者高效的構(gòu)建跨設(shè)備應(yīng)用UI界面?;A(chǔ)能力使用基于ArkTS的聲明
    發(fā)表于 01-17 15:09

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-聲明開(kāi)發(fā)范式組件匯總

    組件是構(gòu)建頁(yè)面的核心,每個(gè)組件通過(guò)對(duì)數(shù)據(jù)和方法的簡(jiǎn)單封裝,實(shí)現(xiàn)獨(dú)立的可視、可交互功能單元。組件之間相互獨(dú)立,隨取隨用,也可以在需求相同的地方重復(fù)使用。聲明開(kāi)發(fā)范式目前可供選擇的組件如下表所示。組件
    發(fā)表于 01-19 11:14

    2022年HarmonyOS/OpenHarmony生態(tài)觀察

    持續(xù)基于聲明開(kāi)發(fā)體系和三大理念長(zhǎng)期演進(jìn),全方面發(fā)展鴻蒙應(yīng)用生態(tài)。在整體流程上,華為從設(shè)計(jì)>開(kāi)發(fā)&
    發(fā)表于 01-19 13:10

    OpenHarmony應(yīng)用開(kāi)發(fā)-ArkUI方舟開(kāi)發(fā)框架簡(jiǎn)析

    構(gòu)建UI,主要基于以下幾點(diǎn)考慮: 開(kāi)發(fā)效率: 聲明開(kāi)發(fā)范式更接近自然語(yǔ)義的編程方式,開(kāi)發(fā)者可以直觀地描述UI,無(wú)需關(guān)心如何實(shí)現(xiàn)UI繪制和渲染,開(kāi)發(fā)高效簡(jiǎn)潔。 應(yīng)用性能: 如下圖所示,
    發(fā)表于 04-23 09:35

    JavaScript JavaScript是什么語(yǔ)言

    JavaScript是屬于開(kāi)發(fā)Web頁(yè)面的腳本編程語(yǔ)言,是一種具有函數(shù)優(yōu)先的輕量級(jí)編程語(yǔ)言。JavaScript基于原型編程、多范式的動(dòng)態(tài)腳本語(yǔ)言,并且支持面向語(yǔ)言、
    的頭像 發(fā)表于 07-27 15:41 ?6557次閱讀

    華為推出新聲明 UI 開(kāi)發(fā)框架(ArkUI

    今年的 HDC 華為開(kāi)發(fā)者大會(huì) 2021,華為又雙叒推出新的聲明 UI 開(kāi)發(fā)框架(ArkUI),咋說(shuō)呢,學(xué)無(wú)止境啊,更新速度堪比坐火箭。
    的頭像 發(fā)表于 01-04 13:39 ?4146次閱讀

    HarmonyOS基于 ArkUI 中 TS 擴(kuò)展聲明開(kāi)發(fā)范式

    本來(lái)計(jì)劃要做一個(gè)本地?cái)?shù)據(jù)庫(kù)存儲(chǔ)相關(guān)的項(xiàng)目,但是官方的小伙伴給我說(shuō),ArkUI 數(shù)據(jù)庫(kù)目前不支持最新的模擬器,所以只能另想其他的。
    的頭像 發(fā)表于 01-04 14:19 ?2209次閱讀

    鴻蒙ArkUI開(kāi)發(fā)-Tabs組件的使用

    鴻蒙ArkUI開(kāi)發(fā)-Tabs組件的使用
    的頭像 發(fā)表于 01-19 16:01 ?1586次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>開(kāi)發(fā)-Tabs組件的使用

    鴻蒙ArkUI:【從代碼到UI顯示的整體渲染流程】

    方舟開(kāi)發(fā)框架(簡(jiǎn)稱ArkUI)是鴻蒙開(kāi)發(fā)的UI框架,提供如下兩種開(kāi)發(fā)范式,我們 **只學(xué)聲明開(kāi)發(fā)范式
    的頭像 發(fā)表于 05-13 16:06 ?709次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>:【從代碼到UI顯示的整體渲染流程】