




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
HarmonyOS鴻蒙應(yīng)用開發(fā)授課:課程團(tuán)隊(duì)項(xiàng)目一目錄03開啟HarmonyOS開發(fā)之旅02認(rèn)識HarmonyOS01課程介紹04創(chuàng)建第一個(gè)應(yīng)用05綜合案例:個(gè)性化設(shè)置應(yīng)用課程介紹01AI說:為何學(xué)鴻蒙開發(fā)?隨著HarmonyOS的崛起,國產(chǎn)操作系統(tǒng)正開啟“一次開發(fā),多端部署”的全場景智慧生態(tài)新紀(jì)元。本課程以華為鴻蒙生態(tài)為基石,通過“基礎(chǔ)-進(jìn)階-實(shí)戰(zhàn)”三級躍遷,帶你掌握鴻蒙應(yīng)用開發(fā)基礎(chǔ)技能。在本課程中,你不僅將學(xué)會(huì)用代碼構(gòu)建萬物互聯(lián)的智能世界,更將成長為支撐國產(chǎn)技術(shù)生態(tài)的先鋒開發(fā)者!課程項(xiàng)目帶來能力躍遷項(xiàng)目7:融會(huì)貫通——七彩天氣App開發(fā)之旅綜合篇項(xiàng)目1:初探HarmonyOS開發(fā)——個(gè)性化設(shè)置應(yīng)用項(xiàng)目2:夯實(shí)ArkTS語言基礎(chǔ)——學(xué)生成績管理項(xiàng)目3:深入ArkTS高級特性——模擬田忌賽馬基礎(chǔ)篇項(xiàng)目4:參透ArkUI界面開發(fā)智慧——字號字體適老化項(xiàng)目5:把我組件通用信息——隨手而動(dòng)的小球項(xiàng)目6:精通ArkUI組件構(gòu)建——模仿美團(tuán)App消息列表進(jìn)階篇020103三級能力躍遷學(xué)習(xí)網(wǎng)站/#/cn/home/consumer/cn/doc//mainPlay/course/246260023.html認(rèn)識HarmonyOS02鴻蒙發(fā)展史核心技術(shù)理念
一次開發(fā),多段部署統(tǒng)一代碼適配手機(jī)/平板/車機(jī)等可分可合,自由流轉(zhuǎn)模塊化開發(fā)+跨設(shè)備任務(wù)接力統(tǒng)一生態(tài),原生智能內(nèi)置AI框架+開放能力標(biāo)準(zhǔn)化開啟HarmonyOS
開發(fā)之旅03開發(fā)之旅安裝配置創(chuàng)建工程注冊華為開發(fā)者下載DevEcoStudio運(yùn)行調(diào)試訪問/填寫注冊信息開發(fā)者實(shí)名認(rèn)證敏感應(yīng)用選擇完善信息認(rèn)證Windows下,下載安裝DevEcoStudio注意勾選“安裝選項(xiàng)”創(chuàng)建應(yīng)用字段釋義Projectname工程名Bundlename包名,應(yīng)用唯一標(biāo)志Savelocation保存地址CompatibleSDK兼容的SDK版本Modulename模塊名稱Devicetype設(shè)備類型下載模擬器單擊“NoDevices”下拉按鈕
選擇“DeviceManager”選項(xiàng)新建模擬器運(yùn)行模擬器
Hyper-V錯(cuò)誤,可訪問以下網(wǎng)址,查看解決方案:/consumer/cn/doc/harmonyos-faqs/faqs-app-running-10創(chuàng)建第一個(gè)應(yīng)用04創(chuàng)建第一個(gè)應(yīng)用打開DevEcoStudio,在菜單欄中找到“File”,在下拉列表里面選擇“New->CreateProject”。創(chuàng)建第一個(gè)應(yīng)用選擇“EmptyAbility”后單擊“Next”按鈕,進(jìn)行下一步操作。創(chuàng)建第一個(gè)應(yīng)用填寫各個(gè)配置項(xiàng)。Projectname:工程名Bundlename:應(yīng)用唯一標(biāo)志Savelocation:保存位置CompatableSDK:兼容的SDK版本Modulename:模塊名稱Devicetype:支持的設(shè)備類型創(chuàng)建第一個(gè)應(yīng)用選擇當(dāng)前窗口顯示還是新開窗口顯示。ThisWindow:當(dāng)前窗口NewWindow:新開窗口Cancel:取消創(chuàng)建第一個(gè)應(yīng)用創(chuàng)建成功。個(gè)性化設(shè)置應(yīng)用05項(xiàng)目目錄全局配置文件模塊配置文件認(rèn)識module.json5文件{"module":{"name":"entry",//模塊名稱"type":"entry",//模塊類型"mainElement":"EntryAbility",//模塊的入口名稱"deviceTypes":["phone","tablet","2in1"],//可以運(yùn)行當(dāng)前模塊的設(shè)備"pages":"$profile:main_pages",//當(dāng)前模塊每個(gè)頁面的信息
"requestPermissions":[],//向系統(tǒng)申請的權(quán)限集合"abilities":[{"name":"EntryAbility",//UIAbility名稱"srcEntry":"./ets/entryability/EntryAbility.ets","launchType":"singleton",//啟動(dòng)類型"icon":"$media:startIcon",//入口圖標(biāo),即應(yīng)用圖標(biāo),優(yōu)先級高于app.json5中配置的應(yīng)用圖標(biāo)"label":"$string:EntryAbility_label",//當(dāng)前UIAbility入口名稱,即應(yīng)用名稱,優(yōu)先級高于app.json5文件中配置的應(yīng)用名稱"startWindowIcon":"$media:startIcon",//應(yīng)用啟動(dòng)瞬間的窗口圖標(biāo)"startWindowBackground":"$color:start_window_background",//應(yīng)用啟動(dòng)瞬間的窗口背景色}]……個(gè)性化設(shè)置在鴻蒙應(yīng)用的工程中,要修改應(yīng)用的名稱,可以在entry/src/main目錄下找到module.json5文件,在abilities節(jié)點(diǎn)下找到name為EntryAbility的入口文件配置,在其中找到label節(jié)點(diǎn),對應(yīng)的值即為應(yīng)用的名稱。按住鍵盤上的Ctrl鍵,將鼠標(biāo)移動(dòng)到“$string:EntryAbility_label”上,待鼠標(biāo)光標(biāo)變?yōu)槭中螘r(shí),單擊即可進(jìn)入應(yīng)用名稱字符串定義的string.json文件,只需修改對應(yīng)的value值即可。更換App名稱圖標(biāo)分為桌面圖標(biāo)和啟動(dòng)圖標(biāo)。繼續(xù)編輯module.json5文件中的內(nèi)容,icon節(jié)點(diǎn)和startWindowIcon節(jié)點(diǎn),分別表示桌面圖標(biāo)和啟動(dòng)圖標(biāo)。將事先準(zhǔn)備好的兩張png圖片,分別命名成app_icon.png和startIcon.png。將app_icon.png放到目錄AppScope/resources/base/media下,將startIcon.png放到目錄entry/src/main/resources/base/media下。更換App桌面圖標(biāo)個(gè)性化設(shè)置更換App名稱更換App桌面圖標(biāo)實(shí)戰(zhàn)操作DevEcoStudio感謝您的觀看紹興職業(yè)技術(shù)學(xué)院廣西自然資源職業(yè)技術(shù)學(xué)院武漢軟件工程職業(yè)學(xué)院山西機(jī)電職業(yè)技術(shù)學(xué)院HarmonyOS鴻蒙應(yīng)用開發(fā)授課:課程團(tuán)隊(duì)項(xiàng)目二目錄03數(shù)據(jù)類型02變量常量聲明01ArkTS語言背景04控制語句05函數(shù)06綜合案例:學(xué)生成績管理ArkTS語言背景01什么是ArkTS?ArkTS是華為HarmonyOS生態(tài)主力開發(fā)語言。我們把“ArkTS”這個(gè)單詞進(jìn)行拆分,可以得到“Ark”和“TS”兩個(gè)單詞。Ark它的意思是方舟,也即華為的“方舟計(jì)劃”。TS是TypeScript的縮寫。DevEcoStudio編寫ArkTS代碼刷新預(yù)覽器打開預(yù)覽器在struct前或后編寫ArkTS代碼輸出內(nèi)容Log輸出面板變量常量聲明02變量變量顧名思義就是可以變的量,可分為局部聲明變量
和
成員聲明變量:(1)局部聲明變量:以關(guān)鍵字let開頭聲明引入變量,在文件內(nèi)直接聲明或在函數(shù)內(nèi)聲明;(2)成員聲明變量:在struct,class,interface等內(nèi)部聲明變量,不需要let。注意:變量在程序執(zhí)行期間可以具有不同的值,但不能是不同類型的值。常量常量就是恒常不變的的量,只能被賦值一次。常量聲明也可以分為
局部聲明常量
和
成員聲明常量。(1)局部聲明常量:以關(guān)鍵字const開頭的聲明,在文件內(nèi)直接聲明或在函數(shù)內(nèi)聲明。(2)成員聲明常量:是指在struct,class,interface等內(nèi)部聲明常量,以關(guān)鍵詞readonly開頭進(jìn)行聲明。注意:常量只能被賦值一次。自動(dòng)類型推斷如果一個(gè)變量或常量的聲明包含了初始值,那么開發(fā)者就不需要顯式指定其類型。數(shù)據(jù)類型03數(shù)據(jù)類型系統(tǒng)Boolean類型boolean表示布爾類型,由
true和
false兩個(gè)邏輯值組成。通常在條件語句中使用boolean類型的變量。下列代碼分別展示了正確和錯(cuò)誤地定義布爾變量的方式。//正確定義布爾類型變量,值為trueletx:boolean=true//該定義將引發(fā)編譯錯(cuò)誤。//因?yàn)锳rkTS有嚴(yán)格的靜態(tài)類型檢查機(jī)制,數(shù)字無法被轉(zhuǎn)換成布爾類型lety:boolean=0constisAdult=true;if(isAdult){console.log('已成年');}else{console.log('未成年');}Number類型在ArkTS中所有數(shù)字,不管是整數(shù)還是小數(shù),正數(shù)還是負(fù)數(shù),都是浮點(diǎn)數(shù)number。number中有2個(gè)比較特殊的:NaN(非數(shù)字)和Infinity(無窮)。輸出BigInt類型Number類型數(shù)據(jù)能表示的最大整數(shù)為2^53-1,可以寫為Number.MAX_SAFE_INTEGER。?但是如果超過了這個(gè)界限,可以用BigInt來表示,它可以表示任意大的整數(shù)。輸出://通過字面量聲明BigInt變量letbigNumber:BigInt=1234567890123456789012345678901234567890n;//用BigInt進(jìn)行指數(shù)運(yùn)算,不需要擔(dān)心溢出letexp:BigInt=5n**100n;//通過BigInt函數(shù)進(jìn)行構(gòu)造letbig:BigInt=BigInt("1234567890123456789012345678901234567890");letsmall:bigint=1234567890123456789012345678901234567890n;//輸出:true,因?yàn)閎ig和small的值相等,且類型相同,均為BigIntconsole.log(String(big===small));//將big轉(zhuǎn)換為字符串console.log(big.toString());String類型string表示字符串類型,可以使用西文雙引號(")或西文單引號(')來包裹文本內(nèi)容。在字符串中支持轉(zhuǎn)義符的使用,比如常見的'\n','\t'等。在字符串中還支持使用占位符${},只不過此時(shí)字符串需要使用反向單引號(`)。輸出://使用雙引號包裹文本內(nèi)容letuserName="Alice";letage=25;//使用反向單引號表示的字符串,支持使用占位符。字符串中用\n進(jìn)行換行l(wèi)etgreeting=`Hello,mynameis${userName}.\nIam${age}yearsold.`;console.log(greeting);Undefined類型和Null類型undefined未定義類型,是一個(gè)沒有設(shè)置值的變量的默認(rèn)值。如果一個(gè)變量進(jìn)行了聲明,但未初始化,它的默認(rèn)值就是undefined。null表示故意賦予變量的空值。它常用于表示空對象或沒有指向任何對象的指針。Enum類型枚舉類型,是預(yù)先定義的一組命名值的值類型,其中命名值又稱為枚舉常量。使用枚舉常量時(shí)必須以枚舉類型名稱為前綴。enumColorSet{Red,Green,Blue
}
//Red、Green和Blue叫枚舉值,也叫枚舉常量letc:ColorSet=ColorSet.Red;console.log('',ColorSet.Red);
//輸出:0console.log('',ColorSet.Green);
//輸出:1console.log('',ColorSet.Blue);
//輸出:2enumColorSet{Red,Green=3,Blue}console.log('',ColorSet.Red.valueOf());
//輸出:0console.log('',ColorSet.Blue.valueOf());
//輸出:4在定義枚舉的時(shí)候,可以給每個(gè)枚舉常量指定值,通常使用數(shù)字進(jìn)行指定。Enum類型枚舉類型,是預(yù)先定義的一組命名值的值類型,其中命名值又稱為枚舉常量。使用枚舉常量時(shí)必須以枚舉類型名稱為前綴。enumColorSet{Red,Green,Blue
}
//Red、Green和Blue叫枚舉值,也叫枚舉常量letc:ColorSet=ColorSet.Red;console.log('',ColorSet.Red);
//輸出:0console.log('',ColorSet.Green);
//輸出:1console.log('',ColorSet.Blue);
//輸出:2enumColorSet{Red,Green=3,Blue}console.log('',ColorSet.Red.valueOf());
//輸出:0console.log('',ColorSet.Blue.valueOf());
//輸出:4在定義枚舉的時(shí)候,可以給每個(gè)枚舉常量指定值,通常使用數(shù)字進(jìn)行指定。Array類型是一種用于存儲?多個(gè)相同類型數(shù)據(jù)?的有序集合。數(shù)組可由數(shù)組復(fù)合字面量(即用方括號括起來的零個(gè)或多個(gè)表達(dá)式的列表,其中每個(gè)表達(dá)式為數(shù)組中的一個(gè)元素)來賦值。數(shù)組的長度由數(shù)組中元素的個(gè)數(shù)來確定,數(shù)組的長度屬性為length。數(shù)組中第一個(gè)元素的索引為0,所以數(shù)組的最大索引值比數(shù)組長度小1。數(shù)組中的元素通過索引進(jìn)行訪問,形如:數(shù)組名[索引]。//創(chuàng)建包含3個(gè)元素的數(shù)組letanimals:string[]=['Tiger','Panda','Rabbit'];//輸出:刪除Rabbitconsole.log("刪除",animals.pop());//輸出:數(shù)組新長度為2console.log("數(shù)組新長度為",animals.length)//添加元素,返回添加后數(shù)組的長度letyrd:Array<string>=['上海','江蘇','浙江'];//往數(shù)組末尾添加“安徽"letnum=yrd.push('安徽');//輸出:目前上三角省份數(shù)目為4console.log('目前長三角省份數(shù)目為',num);//輸出:最后加入的省份是安徽console.log('最后加入的省份是',yrd[yrd.length-1])Tuple類型數(shù)組只能包含一種類型的數(shù)據(jù)。元組類型(Tuple)則可以包含不同數(shù)據(jù)類型的元素。但是其元素順序需要按聲明的類型有序排列。//元組中的類型順序?yàn)閟tring、number、booleanletinfoTuple:[string,number,boolean]=['小紅',20,false];//編譯錯(cuò)誤,定義的類型與實(shí)際類型順序不匹配letinfoTuple:[string,number,boolean]=['小紅',false,20];Union類型聯(lián)合類型使用“|”來聯(lián)合多個(gè)類型,“|”可以簡單地理解為“或”,如“A|B|C”表示類型可以是A、B、C中的任一類型。因此聯(lián)合類型的數(shù)組,可以解決元組帶來的類型順序固定問題。//定義一個(gè)聯(lián)合類型數(shù)組,數(shù)組中的元素類型可以是boolean類型,也可以是string類型,也可以是number類型letarray:(boolean|string|number)[]=['小明',true,180,70.5];//定義一個(gè)變量,類型可以是string,也可以是number。初始值為字符串'小紅'letnameOrAge:string|number='小紅';//重新賦值為數(shù)字20nameOrAge=20;Alias類型別名類型,是一種為現(xiàn)有類型命名的機(jī)制,使類型定義更加清晰和易于理解。類型別名使用type關(guān)鍵字來創(chuàng)建。//為聯(lián)合類型定義別名typeStringOrNumber=string|number;//用別名StringIOrNumber代表了聯(lián)合類型string|numberletvalue:StringOrNumber='Hello';value=123;Record類型記錄類型,它是一種包含多個(gè)字段的數(shù)據(jù)結(jié)構(gòu),它讓開發(fā)者可以像定義字典一樣去定義數(shù)據(jù)。Record<K,T>構(gòu)造了一個(gè)對象類型,該對象的鍵為K類型,值為T類型。鍵類型只能是字符串或數(shù)字,而值的類型則可以任意。//定義交通工具的碳排放系數(shù)(單位:kgCO2/km),鍵為string類型,值為number類型constemissionFactors:Record<string,number>={//各條記錄需要被包裹在{}中
"car":0.2,//記錄以鍵:值的形式書寫,表示鍵和值一一對應(yīng)
"bus":0.1,
"bicycle":0,
"walking":0};letdistance=10letkey='car'//通過鍵修改某條記錄的值:將汽車的排放因子改為0.3emissionFactors[key]=0.3//通過鍵獲取某條記錄的值:輸出“10公里路程,使用交通工具car,排放二氧化碳3千克”console.log(`${distance}公里路程,使用交通工具${key},排放二氧化碳${emissionFactors[key]*distance}千克`)輸出:10公里路程,使用交通工具car,排放二氧化碳3千克控制語句04
控制語句是編程語言中用于控制程序執(zhí)行流程的關(guān)鍵。它允許程序員根據(jù)特定的條件決定程序的執(zhí)行路徑,從而實(shí)現(xiàn)更復(fù)雜和靈活的邏輯。什么是控制語句?if…elseswitch…case三元表達(dá)式for…ofwhiledo…whilethrow和try…catch…finallyforif…elseif語句用于根據(jù)邏輯條件執(zhí)行不同語句。當(dāng)邏輯條件為真時(shí),執(zhí)行對應(yīng)的一組語句,否則執(zhí)行另一組語句(如果有的話)。else部分也可能包含if語句。if(條件1){
//如果條件1成立,則執(zhí)行此花括號內(nèi)的語句}elseif(條件2){
//如果條件2成立,則執(zhí)行此花括號內(nèi)的語句}
else{
//
否則執(zhí)行此花括號內(nèi)的語句}注意:上述格式并不是固定的,在實(shí)際的使用中可以沒有elseif語句和else語句,也可以有多個(gè)elseif語句。if…elseletnum:number=10;if(num%2==0){
console.log(`${num}是偶數(shù)`);}else{
console.log(`${num}是奇數(shù)`);}上述代碼中,由于num的值為10,對2取模之后值為0,因此將輸出:10是偶數(shù)。switch…caseswitch…case語句用來執(zhí)行與表達(dá)式的值匹配的語句。如果表達(dá)式的值等于某個(gè)標(biāo)定的值,則執(zhí)行相應(yīng)的語句。如果沒有任何一個(gè)標(biāo)定值與表達(dá)式的值相匹配,并且switch語句包含default子句,則程序會(huì)執(zhí)行default子句對應(yīng)的語句。每個(gè)語句都以break結(jié)束,用于跳出當(dāng)前switch語句。switch(表達(dá)式){
case值1://如果表達(dá)式與值1匹配,則執(zhí)行下面的語句//語句break;
case值2:
case值3://如果表達(dá)式與值2或值3匹配,則執(zhí)行下面的語句//語句break;
default://如果表達(dá)式與前面的值均不匹配,則執(zhí)行默認(rèn)語句//默認(rèn)語句break;}switch…caseletscore=75;//先除以10,再向下取整,用于獲取數(shù)據(jù)的十位上的數(shù)字switch(Math.floor(score/10)){
case9:
console.log('優(yōu)秀');
break;
case8:
console.log('良好');
break;
case7:
case6:
console.log('及格');
break;
default:
console.log('未知',score/10);
break;}輸出“及格”三元運(yùn)算表達(dá)式三元運(yùn)算表達(dá)式由表達(dá)式A的布爾值來決定返回表達(dá)式B和C中的哪一個(gè)。如果A的結(jié)果為true,則取結(jié)果B作為整個(gè)三元運(yùn)算表達(dá)式的結(jié)果值,否則取結(jié)果C。A表達(dá)式?結(jié)果B:結(jié)果C//可以簡單地記作:若A則B否則Cletscore=20;letlevel=score>=18?'成年':'未成年';console.log(level);//輸出:成年forfor語句是循環(huán)語句的一種,它會(huì)被重復(fù)執(zhí)行,直至循環(huán)條件不成立時(shí)結(jié)束。for([變量初始化表達(dá)式];[條件判斷表達(dá)式];[變量更新表達(dá)式]){
//執(zhí)行語句}letsum=0;for(leti=0;i<101;i++){
sum+=i;}//輸出:1+2+...+99+100=5050console.log('1+2+...+99+100=',sum);for…offor...of語句是一種用于遍歷可迭代對象(如數(shù)組、字符串、Set、Map等)的迭代循環(huán)結(jié)構(gòu)。for...of語句會(huì)返回每個(gè)迭代項(xiàng)的值,并且可以用于任何實(shí)現(xiàn)了迭代器接口的對象。for(let變量of可迭代對象){//執(zhí)行語句}for…of//遍歷數(shù)組letnumbers=[1,2,3,4,5];for(letnumberofnumbers){
console.log(''+number);//輸出:12345}//遍歷字符串letstr="Hello";for(letcharofstr){
console.log(char);//輸出:'H','e','l','l','o'}//遍歷Setletset=newSet(['a','b','c']);for(letitemofset){
console.log(item);//輸出:'a','b','c'}//遍歷Mapletmap=newMap([['key1','value1'],['key2','value2']]);for(letkeyofmap.keys()){
console.log(key,map.get(key));//輸出:'key1value1','key2value2'}//使用break和continuefor(letnumberofnumbers){
if(number===3)continue;//如果數(shù)字是3,則跳過當(dāng)前循環(huán)的剩余代碼
console.log(''+number);
if(number===5)break;//如果數(shù)字是5,則退出循環(huán)}whilewhile(條件){//如果條件成立,則執(zhí)行花括號內(nèi)的語句}while語句是一種基本的循環(huán)控制結(jié)構(gòu),用于在滿足特定條件時(shí)重復(fù)執(zhí)行一段代碼。只要條件為真,循環(huán)就會(huì)繼續(xù)執(zhí)行。一旦條件為假,循環(huán)就會(huì)終止,控制流跳出循環(huán)體,繼續(xù)執(zhí)行循環(huán)之后的代碼。leti=0;//當(dāng)i小于5時(shí),循環(huán)繼續(xù)執(zhí)行while(i<5){
console.log(''+i);//輸出當(dāng)前i的值
i++;//每次循環(huán)后i的值增加1}while(true){
//這段代碼會(huì)被無限執(zhí)行,直至遇到break語句
console.log("Hello,World!");
//根據(jù)某個(gè)條件來中斷循環(huán)
if(/*某個(gè)條件*/){
break;//退出循環(huán)
}}do…whiledo{//先執(zhí)行語句,再判斷條件是否為真。條件為真則繼續(xù)執(zhí)行循環(huán),否則結(jié)束循環(huán)}while(條件)do...while語句是while語句的一個(gè)變體,它至少執(zhí)行一次循環(huán)體,并檢查條件是否為真來決定是否繼續(xù)執(zhí)行循環(huán)。letj=0;do{
console.log(''+j);
j++;}while(j<3);上述do...while示例中,循環(huán)體至少執(zhí)行一次,之后會(huì)檢查j<3
條件是否為真,如果為真,則循環(huán)繼續(xù)執(zhí)行。throw和try...catch...finallythrow和try...catch...finally語句是用于錯(cuò)誤處理的兩個(gè)關(guān)鍵概念,它們共同管理程序中的錯(cuò)誤或異常情況。以下是它們的用法和特點(diǎn)。throw語句用于在代碼的任何地方拋出一個(gè)錯(cuò)誤或異常。一旦執(zhí)行throw語句,程序的控制流就會(huì)立即從throw所在的位置跳轉(zhuǎn)到最近的catch語句,如果錯(cuò)誤未被捕獲,程序?qū)⒔K止。thrownewError("錯(cuò)誤或異常信息");throw和try...catch...finallythrow和try...catch...finally語句是用于錯(cuò)誤處理的兩個(gè)關(guān)鍵概念,它們共同管理程序中的錯(cuò)誤或異常情況。以下是它們的用法和特點(diǎn)。try語句用于包裹可能拋出錯(cuò)誤的代碼。如果try語句中的代碼執(zhí)行過程中沒有發(fā)生錯(cuò)誤,那么try語句之后的代碼將繼續(xù)執(zhí)行;如果try語句中的代碼拋出了錯(cuò)誤,那么程序?qū)⒉粫?huì)執(zhí)行try語句中剩余的代碼,而是直接跳轉(zhuǎn)到catch語句。catch語句用于捕獲try語句中拋出的錯(cuò)誤。catch語句可以訪問一個(gè)參數(shù),這個(gè)參數(shù)通常是Error對象的實(shí)例,包含了錯(cuò)誤的詳細(xì)信息。在catch語句中,可以記錄錯(cuò)誤、顯示錯(cuò)誤信息、執(zhí)行清理操作等。finally語句與try...catch一起使用,無論是否發(fā)生錯(cuò)誤,finally語句中的代碼都會(huì)被執(zhí)行。finally語句通常用于執(zhí)行必要的清理工作,如關(guān)閉文件流、釋放資源等。throw和try...catch...finallytry{
//嘗試執(zhí)行的代碼}catch(e){
//捕獲并處理錯(cuò)誤}finally{
//無論是否發(fā)生錯(cuò)誤都會(huì)執(zhí)行的代碼}實(shí)戰(zhàn)操作DevEcoStudio函數(shù)05CONTENTS目錄01函數(shù)的基本概念02函數(shù)的形式:普通函數(shù)03函數(shù)的形式:箭頭函數(shù)04函數(shù)的參數(shù)類型函數(shù)的基本概念函數(shù)的核心定義函數(shù)是執(zhí)行特定任務(wù)的獨(dú)立代碼塊,通過封裝重復(fù)或特定功能的代碼邏輯,實(shí)現(xiàn)模塊化編程。它可以接收輸入(參數(shù))、處理數(shù)據(jù),并在需要時(shí)返回輸出(返回值)。函數(shù)的核心功能函數(shù)具備三大核心功能:輸入(通過參數(shù)接收外部數(shù)據(jù))處理(內(nèi)部封裝具體業(yè)務(wù)邏輯,如計(jì)算、數(shù)據(jù)轉(zhuǎn)換等)輸出(通過return返回處理結(jié)果,無返回值時(shí)默認(rèn)void)。例如:計(jì)算兩數(shù)之和的函數(shù),輸入是兩個(gè)數(shù)字,處理是相加,輸出是和。優(yōu)點(diǎn):方便代碼復(fù)用,增強(qiáng)代碼可維護(hù)性。函數(shù)的形式:普通函數(shù)構(gòu)成五要素function關(guān)鍵字函數(shù)名參數(shù)返回類型函數(shù)體function函數(shù)名(參數(shù):類型)[:返回類型]{函數(shù)體}[]表示返回類型并不必須,函數(shù)自動(dòng)會(huì)根據(jù)函數(shù)體進(jìn)行推斷。void無需返回:functionsayHello1(name:string):void{console.log(`Hello,${name}!`);}帶return的需要返回值的函數(shù):functionsayHello2(name:string):string{
letstr=`Hello,${name}!`;
returnstr;
}函數(shù)的形式:普通函數(shù)//定義一個(gè)普通函數(shù):sayHello1//該函數(shù)接收一個(gè)string類型的參數(shù)name,并輸出一條問候語//返回類型為void,表示該函數(shù)沒有返回值functionsayHello1(name:string):void{
console.log(`Hello,${name}!`);}//定義一個(gè)普通函數(shù):sayHello2//該函數(shù)接收一個(gè)string類型的參數(shù)name,并輸出一條問候語//未顯式指定返回類型,ArkTS會(huì)根據(jù)函數(shù)體推斷返回類型為voidfunctionsayHello2(name:string){
console.log(`Hello,${name}!`);}
//調(diào)用函數(shù)sayHello1,傳入?yún)?shù)"World",輸出:Hello,World!sayHello1("World");
//調(diào)用函數(shù)sayHello2,傳入?yún)?shù)"World",輸出:Hello,World!sayHello2("World");函數(shù)的形式:普通函數(shù)//定義一個(gè)帶返回值的普通函數(shù):sum1//該函數(shù)接收兩個(gè)number類型的參數(shù)a和b,并返回它們的和//顯式指定返回類型為numberfunctionsum1(a:number,b:number):number{
returna+b;//返回a和b的和}//定義一個(gè)帶返回值的普通函數(shù):sum2//該函數(shù)接收兩個(gè)number類型的參數(shù)a和b,并返回它們的和//未顯式指定返回類型,TypeScript會(huì)根據(jù)return語句推斷返回類型為numberfunctionsum2(a:number,b:number){
returna+b;//返回a和b的和}
//使用函數(shù)sum1的返回值,輸出:15console.log(`${sum1(5,10)}`);//使用函數(shù)sum2的返回值,輸出:15console.log(`${sum2(5,10)}`);函數(shù)的形式:箭頭函數(shù)是匿名函數(shù)的簡寫形式,屬于函數(shù)表達(dá)式。省略function關(guān)鍵字,適合用于簡單的邏輯和回調(diào)函數(shù)。自動(dòng)綁定this上下文,免去了普通函數(shù)手動(dòng)綁定上下文。//使用箭頭函數(shù)定義簡潔的函數(shù)letmultiply1=(x:number,y:number):number=>x*y;//寫明返回類型的單行箭頭函數(shù)letmultiply2=(x:number,y:number)=>x*y;//不寫明返回類型的單行箭頭函數(shù)//寫明返回類型的基本箭頭函數(shù)letsum1=(x:number,y:number):number=>{
returnx+y;}//不寫明返回類型的基本箭頭函數(shù)letsum2=(x:number,y:number)=>{
returnx+y;}//調(diào)用箭頭函數(shù)console.log('',multiply1(3,4));//輸出:12console.log('',multiply2(3,4));//輸出:12console.log('',sum1(10,20));//輸出:30console.log('',sum2(10,20));//輸出:30函數(shù)的參數(shù)形參(形式參數(shù)):定義函數(shù)時(shí)使用的參數(shù)。實(shí)參(實(shí)際參數(shù)):調(diào)用函數(shù)時(shí)傳入的參數(shù)。函數(shù)的參數(shù)可以是可選的,也可以有默認(rèn)值,還可以用剩余參數(shù)來接收任意數(shù)量的實(shí)參。函數(shù)的可選參數(shù)可選參數(shù)是指在調(diào)用函數(shù)時(shí)不一定要提供的參數(shù)。如果調(diào)用函數(shù)時(shí)沒有提供實(shí)參,那么它將默認(rèn)為undefined。可選參數(shù)的參數(shù)名后面需要加上問號(?)。注意,可選參數(shù)后面不能放置必需參數(shù)。//參數(shù)message為必需參數(shù),參數(shù)optionalMessage為可選參數(shù)functionshowMessage(msg:string,optionalMsg?:string):void{
console.log(msg);
if(optionalMsg){
console.log(optionalMsg);
}}//只提供必需參數(shù)showMessage("Hello,World!");//提供必需參數(shù)和可選參數(shù)showMessage("Hello,World!","這是可選參數(shù).");//兩個(gè)參數(shù)均為可選參數(shù)functionsendOptionalParams(str?:string,num?:number){
//函數(shù)內(nèi)容}
//寫成sendOptionalParams(1)將報(bào)錯(cuò)sendOptionalParams('文字',1);參數(shù)的默認(rèn)值在定義函數(shù)時(shí)允許為參數(shù)指定一個(gè)默認(rèn)值,如果調(diào)用函數(shù)時(shí)沒有提供該參數(shù)的值,則將使用默認(rèn)值。在參數(shù)后面用等號(=)指定默認(rèn)值。functionshowMessage(msg:string,optionalMsg:string="參數(shù)默認(rèn)值"):void{
console.log(msg,optionalMsg);}//optionalMsg將使用默認(rèn)值,輸出“Hello,World!參數(shù)默認(rèn)值”showMessage("Hello,World!");//optionalMsg的值被明確提供,輸出“Hello,World!傳入?yún)?shù)值”showMessage("Hello,World!","傳入?yún)?shù)值");剩余參數(shù)剩余參數(shù)允許開發(fā)者將一個(gè)不確定數(shù)量的參數(shù)表示為一個(gè)特殊的數(shù)組,可允許函數(shù)接收任意數(shù)量的參數(shù)。剩余參數(shù)時(shí)需要在參數(shù)名前加三個(gè)點(diǎn)(...),且其只能作為函數(shù)的最后一個(gè)形參。在函數(shù)體中,剩余參數(shù)被當(dāng)成數(shù)組使用。//獲取人員的完整姓名。姓氏restNames被定義為剩余參數(shù)functiongetPersonName(firstName:string,...restNames:string[]){
//restNames是數(shù)組,可使用數(shù)組的join方法連接姓名
console.log(firstName+''+restNames.join(''));}//不提供剩余參數(shù)。輸出:AlicegetPersonName('Alice');//提供剩余參數(shù)'Samuel','Lucas','Mack'。//輸出:JosephSamuelLucasMackgetPersonName('Joseph','Samuel','Lucas','Mack');感謝您的觀看紹興職業(yè)技術(shù)學(xué)院廣西自然資源職業(yè)技術(shù)學(xué)院武漢軟件工程職業(yè)學(xué)院山西機(jī)電職業(yè)技術(shù)學(xué)院HarmonyOS鴻蒙應(yīng)用開發(fā)授課:課程團(tuán)隊(duì)項(xiàng)目三目錄03特殊操作符02抽象類和接口01類04異步執(zhí)行05導(dǎo)入和導(dǎo)出模塊類01類03方法02構(gòu)造方法01字段04訪問修飾符05繼承機(jī)制什么是類?
類(Class)是面向?qū)ο缶幊讨械囊粋€(gè)基本概念,它作為創(chuàng)建對象的藍(lán)圖或模板,定義了一組特定的字段和方法。
類可以被看作一個(gè)模板,用于制造具有相同特征和行為的對象(Object)。class類名{
字段
構(gòu)造方法
方法}類的字段字段是直接在類中聲明的某種類型的變量。字段實(shí)例字段靜態(tài)字段實(shí)例字段存在于類的每個(gè)實(shí)例上,每個(gè)實(shí)例都有自己的實(shí)例字段集合。實(shí)例字段必須在定義時(shí)初始化或者在構(gòu)造方法中初始化。調(diào)用格式為:實(shí)例.字段名。使用關(guān)鍵字static將字段聲明為靜態(tài)字段。靜態(tài)字段屬于類本身,類的所有實(shí)例共享一個(gè)靜態(tài)字段。要訪問靜態(tài)字段,需要使用類名,調(diào)用格式為:類名.字段名。0102實(shí)例字段靜態(tài)字段類的
實(shí)例字段
和
靜態(tài)字段輸出:字段權(quán)限控制
在面向?qū)ο缶幊讨?,往往不希望直接訪問實(shí)例字段,可通過將字段設(shè)置為private(私有)來拒絕外部直接訪問,轉(zhuǎn)由getter(讀?。┖蛃etter(設(shè)置)控制字段的訪問。構(gòu)造方法
構(gòu)造方法用于實(shí)例化類,從而得到對象,在構(gòu)造方法內(nèi)部往往初始化相關(guān)字段。
在前面的銀行賬戶案例中,通過代碼letaccount=newBankAccount()創(chuàng)建類的實(shí)例(也叫類的對象),實(shí)際上是在調(diào)用類的無參構(gòu)造方法。constructor([參數(shù)列表]){
//初始化操作}無參構(gòu)造方法在類中如果沒有顯式地定義構(gòu)造方法,則系統(tǒng)會(huì)默認(rèn)提供一個(gè)無參構(gòu)造方法。有參構(gòu)造方法當(dāng)在類中顯式地定義構(gòu)造方法時(shí),該類默認(rèn)的無參構(gòu)造方法失效。方法在面向?qū)ο缶幊讨?,函?shù)被稱為方法。在類中可以定義實(shí)例方法或者靜態(tài)方法。靜態(tài)方法屬于類本身,只能訪問靜態(tài)字段。實(shí)例方法既可以訪問靜態(tài)字段,又可以訪問實(shí)例字段。(1)實(shí)例方法
實(shí)例方法必須通過對象進(jìn)行調(diào)用,調(diào)用格式為:實(shí)例名.方法名()。(2)靜態(tài)方法
使用關(guān)鍵字static將方法聲明為靜態(tài)方法。
靜態(tài)方法定義了類作為一個(gè)整體的公共行為,調(diào)用格式為:
類名.方法名()。靜態(tài)方法和實(shí)例方法代碼示例實(shí)戰(zhàn)操作假設(shè)有一個(gè)汽車制造廠,每輛汽車都遵循同一套設(shè)計(jì)圖紙(類),同時(shí)每輛汽車都是獨(dú)立的實(shí)體(對象),擁有自己的顏色、型號等屬性,并且能夠執(zhí)行相同的操作,如啟動(dòng)、行駛等,利用類的相關(guān)知識實(shí)現(xiàn)上述過程。訪問修飾符前面已學(xué)過,通過將字段設(shè)置為private訪問修飾符,可使字段無法在類外部被訪問。訪問修飾符用于控制類成員(字段和方法)的可見性和訪問權(quán)限。public:公開的,可被繼承,可以在任何地方訪問。缺省時(shí)的默認(rèn)修飾符。private:私有的,不可被繼承,只能在定義它的類內(nèi)部訪問。protected:受保護(hù)的,可被繼承,可以在定義它的類及其子類的內(nèi)部訪問。改造之前的銀行賬戶系統(tǒng)BankAccount,賬戶持有人可以查看余額(public),但只有系統(tǒng)內(nèi)部可以修改賬戶的交易記錄(private)。如果賬戶持有人需要修改賬戶設(shè)置,則需要通過受保護(hù)的方法(protected)來實(shí)現(xiàn),這些方法可以由賬戶持有人或銀行員工調(diào)用。繼承機(jī)制
類的繼承是面向?qū)ο缶幊讨凶钪匾母拍钪?,它是指一個(gè)類可以從現(xiàn)有的類中派生而來,它允許開發(fā)者根據(jù)一個(gè)類來定義另一個(gè)類,可以將一個(gè)類中的操作和數(shù)據(jù)結(jié)構(gòu)提供給另一個(gè)類,使得創(chuàng)建和維護(hù)程序變得更容易,同時(shí)有利于復(fù)用代碼和節(jié)省開發(fā)時(shí)間。繼承的關(guān)鍵字是extends。class
類A
extends
類B
{}通過繼承,子類可以把父類中除構(gòu)造方法、私有字段、私有方法以外的字段和方法都繼承下來。子類要調(diào)用父類的方法或構(gòu)造方法,可以使用關(guān)鍵字super。子類對父類方法進(jìn)行重寫,則需要使用關(guān)鍵字override。實(shí)戰(zhàn)操作
在團(tuán)隊(duì)中,每個(gè)人都扮演著重要的角色,共同為實(shí)現(xiàn)目標(biāo)貢獻(xiàn)力量。這種協(xié)作精神不僅體現(xiàn)了集體的力量,也展現(xiàn)了個(gè)人與團(tuán)隊(duì)的和諧統(tǒng)一。
下面通過定義:父類TeamMember(團(tuán)隊(duì)成員)子類Developer(開發(fā)者)子類Designer(設(shè)計(jì)師)
展示如何在代碼中體現(xiàn)團(tuán)隊(duì)協(xié)作、團(tuán)隊(duì)分工及個(gè)性化貢獻(xiàn)。抽象類和接口02多態(tài)
多態(tài)是面向?qū)ο缶幊痰暮诵母拍钪?,它允許不同的對象對同一消息做出響應(yīng),但具體的行為會(huì)根據(jù)對象的實(shí)際類型而有所不同。抽象類和接口是實(shí)現(xiàn)多態(tài)的兩種方式。抽象類
抽象類是面向?qū)ο缶幊讨械囊环N結(jié)構(gòu),它不能被直接實(shí)例化,通常被用作父類。
抽象類可以包含抽象方法,這些抽象方法只定義了名稱和參數(shù),而沒有具體的實(shí)現(xiàn)。
抽象類的非抽象子類必須實(shí)現(xiàn)抽象父類的抽象方法。
抽象類和抽象方法都需要被關(guān)鍵字abstract修飾。//抽象類abstract
class
抽象類名{
字段
構(gòu)造方法
具體方法
//抽象方法,不能有方法實(shí)現(xiàn)。待子類實(shí)現(xiàn)
abstract抽象方法名([若干參數(shù)]):返回值類型;}抽象方法:沒有具體實(shí)現(xiàn)的方法,它們定義了子類必須遵循的規(guī)范。子類實(shí)現(xiàn):子類通過提供抽象方法的具體實(shí)現(xiàn),展示了多態(tài)。這意味著同名的方法可以在不同的子類中有不同的行為。實(shí)戰(zhàn)操作
通過定義抽象類Animal和FourFeetAnimal,定義具體類Dog和Cat,演示如何通過抽象類實(shí)現(xiàn)多態(tài)。接口接口定義了一組方法,但不提供實(shí)現(xiàn)。實(shí)現(xiàn)接口的類必須提供所有方法的具體實(shí)現(xiàn)。接口的定義需要使用關(guān)鍵字interface,接口不能包含任何方法的實(shí)現(xiàn)。與抽象類不同的是,接口方法不能被關(guān)鍵字abstract修飾。與類繼承只能單繼承不同,一個(gè)類允許實(shí)現(xiàn)多個(gè)接口。interface接口名{
字段名:字段類型;
方法名([參數(shù)列表]):返回類型;}
方法:接口確保實(shí)現(xiàn)它的類遵循特定的結(jié)構(gòu)。
多態(tài)實(shí)現(xiàn):當(dāng)不同的類實(shí)現(xiàn)同一個(gè)接口時(shí),方法可以有不同的實(shí)現(xiàn),這體現(xiàn)了多態(tài)。接口Dog類實(shí)現(xiàn)了兩個(gè)接口:Animal和Swimmable。這意味著Dog類必須提供Animal接口中的makeSound方法和Swimmable接口中的swim方法的具體實(shí)現(xiàn)。通過實(shí)現(xiàn)Swimmable接口,Dog類擴(kuò)展了功能,現(xiàn)在它不僅能發(fā)出聲音,還能游泳。接口
接口除為類提供可擴(kuò)展性之外,還常被用來定義數(shù)據(jù)結(jié)構(gòu)。相較于類,接口更適合用于定義純數(shù)據(jù)結(jié)構(gòu),原因在于接口無具體的方法實(shí)現(xiàn),在編譯后將無運(yùn)行時(shí)開銷,且支持多重繼承,有利于數(shù)據(jù)結(jié)構(gòu)的擴(kuò)展。特殊操作符03特殊操作符03空值賦值運(yùn)算符02空值合并操作符01可選操作符04非空斷言操作符為何要引入特殊操作符?在實(shí)際編程時(shí),經(jīng)常需要處理可能不存在的屬性或變量,即項(xiàng)目二中介紹的類型中的null或undefined。為了簡化代碼并減少運(yùn)行時(shí)的錯(cuò)誤,ArkTS引入了幾個(gè)特殊操作符,幫助開發(fā)者以更安全、更直觀的方式處理這些情況??蛇x操作符(?)空值合并操作符(??)空值賦值運(yùn)算符(??=)非空斷言操作符(?。┛蛇x操作符(?)“可選”是一個(gè)用于描述值可能不存在的概念,它在類型系統(tǒng)中用于表示某些值在運(yùn)行時(shí)可能不會(huì)被提供??蛇x操作符允許讀取位于對象鏈(對象鏈指通過連續(xù)的點(diǎn)操作符訪問嵌套對象屬性的層級路徑,如obj.a.b.c)深處的屬性的值,而不必明確驗(yàn)證對象鏈中的每個(gè)引用是否有效(有效即不為undefined或null),在引用無效的情況下不會(huì)引起錯(cuò)誤,直接返回。interfaceDay{
num:number}interfaceCourseInfo{
professor:string
cfu:number
//定義字段時(shí),在字段名后加可選操作符,表示days是一個(gè)可選字段
days?:Array<Day>|undefined|null}letcourse:CourseInfo|undefined//用可選操作符安全地訪問深層屬性professor。由于course值為undefined,直接輸出:undefinedconsole.log(course?.professor);course={
professor:'張教授',
cfu:4,
days:undefined}//使用可選操作符安全地訪問深層屬性,course值不為undefined或null,輸出:張教授console.log(course?.professor);//使用可選操作符安全地訪問深層屬性,由于days值為undefined,直接輸出:undefinedconsole.log(course?.days?.length.toString());空值合并操作符(??)
空值合并操作符(??)是一個(gè)邏輯操作符,當(dāng)其左側(cè)的操作數(shù)為null或者undefined時(shí),返回其右側(cè)的操作數(shù),否則返回其左側(cè)的操作數(shù)。constnullValue=null;
//空字符串,是一個(gè)假值,Boolean("")===falseconstemptyText="";constvalA=nullValue??"valA的默認(rèn)值";constvalB=emptyText??"valB的默認(rèn)值";
//輸出"valA的默認(rèn)值"console.log(valA);
//輸出""(空字符串雖然是假值,但不是null或者undefined)console.log(valB);空值賦值運(yùn)算符(??=)
當(dāng)空值賦值運(yùn)算符(??=)左側(cè)變量的值為null或undefined時(shí),右側(cè)變量的值會(huì)被賦給左側(cè)變量。在一些場景下,使用空值賦值運(yùn)算符可以省略很多代碼。letb='hello';leta='0';b??=a;//b的值仍然是'hello'letc:string|null=null;letd='123';c??=d;//c的值變?yōu)?123'非空斷言操作符(!)
非空斷言操作符(!)用于告訴編譯器某個(gè)位置的值肯定不是null或undefined,通常在開發(fā)者確信某個(gè)位置的值不會(huì)是null或undefined時(shí)使用。interfaceUser{
name:string;
age?:number;//age是一個(gè)可選字段}//定義一個(gè)值可能為undefined的變量letuser:User|undefined={
name:"小紅",};//使用非空斷言操作符console.log(user!.name);//輸出:小紅//嘗試訪問可選屬性ageconsole.log(user!.age!.toString());//程序?qū)?bào)錯(cuò)異步執(zhí)行04什么是異步執(zhí)行
代碼按照順序往下執(zhí)行,前序任務(wù)完成才能執(zhí)行后序任務(wù),這樣的執(zhí)行機(jī)制叫同步(Synchronous)執(zhí)行,其優(yōu)點(diǎn)是邏輯清晰易調(diào)試,但會(huì)導(dǎo)致阻塞問題;為此引入異步(Asynchronous)執(zhí)行機(jī)制,異步執(zhí)行允許程序在等待耗時(shí)操作(如網(wǎng)絡(luò)請求或文件讀寫)時(shí)不停止執(zhí)行,轉(zhuǎn)而繼續(xù)執(zhí)行后續(xù)任務(wù),從而提升效率和響應(yīng)性。ArkTS通過Promise和async/await提供基礎(chǔ)異步并發(fā)能力。PromisePromise是一個(gè)用于處理異步操作的類,可以將異步操作轉(zhuǎn)換為類似同步操作的風(fēng)格,以方便代碼編寫和維護(hù)。
Promise提供了一個(gè)狀態(tài)機(jī)制來管理異步操作的不同階段,并提供了一些方法來注冊回調(diào)函數(shù)以處理異步操作結(jié)果。Promise對象有3種狀態(tài):pending(進(jìn)行中)、fulfilled(已完成)和rejected(已拒絕)。
Promise對象創(chuàng)建后處于pending狀態(tài),并在異步操作完成后轉(zhuǎn)換為fulfilled或rejected狀態(tài)。newPromise<T>(executor:(resolve:(value:T)=>void,reject:(reason?:any)=>void)=>void)
上述Promise構(gòu)造方法中的<T>表示泛型(Generics),泛型機(jī)制提供了編譯時(shí)類型檢查,它確保代碼使用正確的類型,減少需要進(jìn)行的顯式類型轉(zhuǎn)換。構(gòu)造方法的參數(shù)executor為一個(gè)帶有兩個(gè)參數(shù)的函數(shù)。參數(shù)resolve和reject分別表示異步操作成功和失敗時(shí)應(yīng)該調(diào)用的方法。resolve方法傳遞的參數(shù)的類型受泛型<T>約束,reject方法傳遞的參數(shù)通常為Error或其子類。Promise代碼示例//resolve和reject兩個(gè)回調(diào)函數(shù)constpromise:Promise<number>=newPromise((resolve:Function,reject:Function)=>{
setTimeout(()=>{
constrandomNumber:number=Math.random();
if(randomNumber>0.5){
//resolve回調(diào)函數(shù)會(huì)返回一個(gè)狀態(tài)為fulfilled的Promise對象
resolve(randomNumber);
}else{
//reject函數(shù)回調(diào)會(huì)返回一個(gè)狀態(tài)為rejected的Promise對象
reject(newError('數(shù)字太小了'));
}},1000);})promise.then((result:number)=>{
console.info(`隨機(jī)數(shù)是:${result}`);}).catch((error:Error)=>{
console.error(`錯(cuò)誤信息:`+error.message);});async/awaitasync/await是一種用于處理異步操作的Promise語法糖,其使異步代碼變得更加簡單和易讀,避免多層回調(diào)嵌套。通過使用async關(guān)鍵字聲明一個(gè)函數(shù)為異步函數(shù),并使用await關(guān)鍵字等待Promise的解析(完成或拒絕),以同步的方式編寫異步操作的代碼。asyncfunctiondownload():Promise<void>{
console.log('開始下載')
//await表示等待Promise對象進(jìn)行執(zhí)行,不需要使用then去執(zhí)行
constresult:string=awaitnewPromise((resolve:Function)=>{
letprogress=0
letid=setInterval(()=>{
progress+=20
console.log('下載中',progress,'%')
if(progress>=100){
resolve('下載成功')
clearInterval(id)
}},1000)
})
console.log('輸出結(jié)果:'+result)}download()//調(diào)用download函數(shù)感謝您的觀看HarmonyOS鴻蒙應(yīng)用開發(fā)授課:課程團(tuán)隊(duì)項(xiàng)目四目錄03應(yīng)用資源的管理與訪問02ArkUI中的像素單位01了解ArkUI基本概念04綜合案例:字體字號適老化了解ArkUI基本概念01什么是ArkUI?ArkUI即方舟UI框架,它為HarmonyOS應(yīng)用的UI開發(fā)提供了完整的基礎(chǔ)設(shè)施,包括簡潔的UI語法、豐富的UI功能(組件、布局、動(dòng)畫及交互事件),以及實(shí)時(shí)界面預(yù)覽工具等。具有以下主要特點(diǎn):1.極簡的UI語法2.豐富的內(nèi)置UI組件3.多維度的狀態(tài)管理機(jī)制4.支持多設(shè)備開發(fā)5.實(shí)時(shí)預(yù)覽機(jī)制ArkUI的開發(fā)范式ArkUI框架支持兩種開發(fā)范式:1.類Web開發(fā)范式(官方已不推薦)2.聲明式開發(fā)范式從“Hello,HarmonyOS”了解聲明式開發(fā)范式實(shí)戰(zhàn)操作聲明式范式開發(fā)初體驗(yàn)ArkUI中的像素單位02問題?在萬物互聯(lián)的全場景時(shí)代,HarmonyOS打破了設(shè)備邊界的限制,讓同一個(gè)應(yīng)用可以自由流轉(zhuǎn)于手機(jī)、平板計(jì)算機(jī)、車載終端等形態(tài)各異的設(shè)備之間。這種革命性的跨設(shè)備體驗(yàn)對UI開發(fā)提出了前所未有的挑戰(zhàn)。——如何在不同尺寸的屏幕上實(shí)現(xiàn)視覺呈現(xiàn)的完美統(tǒng)一?影響屏幕顯示的關(guān)鍵要素像素:屏幕顯示的最小單位,屏幕上的一個(gè)小亮點(diǎn)就是一個(gè)像素,1像素記作1px分辨率:屏幕上橫向和縱向像素?cái)?shù),如分辨率1080×2340指的是屏幕上橫向像素?cái)?shù)為1080個(gè),縱向像素?cái)?shù)為2340個(gè)尺寸:屏幕對角線的長度,單位為英寸像素密度:每英寸屏幕上的像素?cái)?shù)用px作為單位來顯示會(huì)怎樣?如果直接用px作為單位來定義圖像尺寸,那么在不同像素密度的屏幕上,相同像素?cái)?shù)對應(yīng)的物理尺寸不一樣,會(huì)導(dǎo)致同一個(gè)應(yīng)用在不同設(shè)備上顯示的尺寸不同。解決ArkUI引入虛擬像素(VirtualPixel)的概念。虛擬像素是一種可根據(jù)屏幕的像素密度靈活縮放的單位,通常以vp表示。1vp相當(dāng)于像素密度為160ppi的屏幕上的1px。在不同像素密度的屏幕上,系統(tǒng)會(huì)根據(jù)如下公式將虛擬像素?fù)Q算為對應(yīng)的物理像素。結(jié)論在絕大部分情況下,字體使用fp作為單位,其它使用vp作為單位,即可解決問題。應(yīng)用資源的管理與訪問03問題在應(yīng)用的開發(fā)過程中,經(jīng)常會(huì)用到字體、顏色、圖片、間距、音頻、視頻等資源。這些資源中既有開發(fā)者管理的應(yīng)用資源,又有系統(tǒng)提供的系統(tǒng)資源。如何能管理好自己應(yīng)用的資源呢?如何訪問這些資源呢?模塊級資源開發(fā)者自己管理的應(yīng)用資源通常在工程的resources文件夾下。在resources文件夾下,默認(rèn)帶有base、dark和rawfile文件夾,分別用來管理基礎(chǔ)資源、深色模式資源和原始資源。在每一個(gè)模塊(module)下面都有resources文件夾,模塊下的資源僅對當(dāng)前模塊有效。如圖中entry模塊下的資源僅供entry模塊內(nèi)使用。應(yīng)用級資源在整個(gè)應(yīng)用下有一個(gè)AppScope文件夾,其下也有一個(gè)resources文件夾,其內(nèi)部的資源文件定義規(guī)則與模塊中的相同,只不過其下的資源可以供整個(gè)應(yīng)用調(diào)用?;A(chǔ)資源基礎(chǔ)資源應(yīng)該被放置在base文件夾下,可分為element、media、profile三類,base文件夾下的特定資源文件夾。深色資源深色模式是應(yīng)用中的一種用于在環(huán)境較暗的情況下提升視覺舒適度的設(shè)計(jì)方案。深色模式資源被放置在dark文件夾下,dark文件夾下通常放置與顏色有關(guān)的資源,如包含在深色模式下的字體顏色、背景色的color.json文件,在深色模式下應(yīng)該被顯示的圖片等資源。原始資源原始資源應(yīng)該放置在rawfile文件夾下,不能被壓縮和編譯的圖片、視頻、文本等文件都應(yīng)該放到該文件夾下。這些文件需要保持原始的數(shù)據(jù)格式和內(nèi)容,未經(jīng)過任何處理或轉(zhuǎn)換。它們可能包含數(shù)碼相機(jī)、掃描器或電影膠片掃描儀等通過圖像傳感器直接捕獲的數(shù)據(jù)。在實(shí)際的軟件開發(fā)中,rawfile文件夾也用于存儲文本文件的原始數(shù)據(jù)文件。例如,rawfile文件夾可以用于存儲城市列表文件,這些文件包含了應(yīng)用需要的基礎(chǔ)數(shù)據(jù),如城市編碼、城市名稱等。資源的訪問對于資源的訪問,ArkUI提供了如下兩個(gè)方法:function$r(value:string,…params:any[]):Resource;function$rawfile(value:string):Resource;應(yīng)用資源訪問base目錄下的資源會(huì)被編譯成二進(jìn)制文件并賦予唯一的ID,使用相應(yīng)資源時(shí)通過$r('')的形式訪問。引號中的內(nèi)容分為三段:app是固定值,代表當(dāng)前應(yīng)用內(nèi)的資源type表示資源類型,其值可以是color、string、float、media、profile等name則是定義時(shí)的資源名應(yīng)用資源訪問示例應(yīng)用資源訪問示例系統(tǒng)資源訪問除了自定義應(yīng)用資源,開
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年初等教育服務(wù)項(xiàng)目申請報(bào)告
- 2026年外研版高考英語一輪復(fù)習(xí)考點(diǎn)梳理選擇性必修第四冊Unit4 Everyday economics
- 2025年西式面點(diǎn)師(高級)證考試題庫
- 2026年高考語文備考之《紅樓夢》有關(guān)的信息類文本閱讀試題匯編(一)含答案解析
- 2025中考數(shù)學(xué)試題分類匯編:三角形及全等三角形(40題)含答案+解析
- 2025年山東省濟(jì)南市槐蔭區(qū)八年級下期末語文試題(含答案)
- 2026年中考數(shù)學(xué)復(fù)習(xí):統(tǒng)計(jì) 講義(含測試卷及答案)
- 廣東省肇慶市2022-2023學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量檢測英語試題(解析版)
- 2025年人教版新高二物理暑假復(fù)習(xí):碰撞問題分析(學(xué)生版)
- 辦公室禮儀與職責(zé)
- 維修工崗位考試題及答案
- 2026高考地理《地理原理》復(fù)習(xí)課件
- 關(guān)于新時(shí)代遼寧省國家大學(xué)科技園建設(shè)發(fā)展思路及模式的建議
- 2025叉車?yán)碚摽荚囋囶}及答案
- 2025年廣西公需科目答案03
- 礦井托管運(yùn)營方案(3篇)
- 《聚碳酸酯合成》課件
- 2025年中國不銹鋼寬幅網(wǎng)市場調(diào)查研究報(bào)告
- 解讀2025年金融行業(yè)的重要事件試題及答案
- 新版《醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范》培訓(xùn)課件
- 計(jì)量檢定機(jī)構(gòu)質(zhì)量手冊
評論
0/150
提交評論