柚子快報(bào)激活碼778899分享:職場(chǎng)和發(fā)展 鴻蒙面試心得
柚子快報(bào)激活碼778899分享:職場(chǎng)和發(fā)展 鴻蒙面試心得
自疫情過后,java和web前端都進(jìn)入了冰河時(shí)代。年齡、薪資、學(xué)歷都成了找工作路上躲不開的門檻。
年齡太大pass
薪資要高了pass
學(xué)歷大專pass
好多好多pass
找工作的路上明明陽(yáng)關(guān)普照,卻有一種凄凄慘慘戚戚說(shuō)不清道不明的“優(yōu)雅”意境。
如何破局?
鴻蒙!?
好了廢話不多說(shuō),下面進(jìn)入正題
先聊一聊怎么學(xué)習(xí)鴻蒙
一、不建議報(bào)班
目前有好多培訓(xùn)班,對(duì)有web開發(fā)經(jīng)驗(yàn)的人來(lái)說(shuō),我個(gè)人不建議報(bào)班。
要花費(fèi)大量的時(shí)間
花費(fèi)一定的money,現(xiàn)在錢不好賺能省則省吧
?那么我們?nèi)绾伍_始學(xué)習(xí)鴻蒙呢?
二 、B站
現(xiàn)在B站里面黑馬、千峰、尚硅谷已經(jīng)出了多期基礎(chǔ)視頻,可以先看看這些視頻,然后跟著老師把項(xiàng)目寫一下,大概花兩周的時(shí)間吧。
這樣可以快速的了解什么是鴻蒙,鴻蒙做了哪些事情,為以后的自己獨(dú)立學(xué)習(xí)奠定基礎(chǔ)
三、鴻蒙官方API?
HarmonyOS應(yīng)用-HarmonyOS開發(fā)者-華為開發(fā)者聯(lián)盟
文檔中心
或者
鴻蒙 ArkTS 應(yīng)用快速上手手冊(cè)_w3cschool
如果兄弟們時(shí)間緊張可以先看下面這幾個(gè)模塊,一般看完面試就夠用了
項(xiàng)目結(jié)構(gòu)?
?
UI
如果ts薄弱可以看看這個(gè)
有框架的認(rèn)知
有ts處理邏輯
有UI展示頁(yè)面
這樣一個(gè)APP大概就全了,如果兄弟們還有精力,那肯定是api研究的越全面越好啦
面試?
如果兄弟們這些都學(xué)完了,那么可以進(jìn)行面試了:
需要注意的是面試分線下面試和線上面試
線下面試
如果是線下面試那兄弟們要注意了,可能要現(xiàn)場(chǎng)寫代碼,所以我建議先學(xué)完了我上面說(shuō)的再去面試。如果寫不出來(lái)白白浪費(fèi)了一次機(jī)會(huì)。
不過線下寫代碼也不要擔(dān)心,一般都是基礎(chǔ)布局,在固定的時(shí)間內(nèi)完成就行。
我先說(shuō)一下我線下面試時(shí)需要注意的事項(xiàng):
1.?如果大家習(xí)慣鍵盤和鼠標(biāo)的話最好自己備上。
2.?面試官的需求文檔一定要先看懂了,有全局的把控再開始寫代碼,不懂就問。
3.?得分點(diǎn)一定要清楚,而且都要實(shí)現(xiàn)
具體有哪些得分點(diǎn),我給兄弟們舉幾個(gè)我在面試中遇到的
1.? 用到組件化思想
2.?布局元素不能少,也就是和UI設(shè)計(jì)高度保真
3.?一些類型最好定義成枚舉
4.?顏色變量定義到這里
5.?http請(qǐng)求的封裝
6.?列表盡量用LazyForEach提升性能
?線上面試
?我這里總結(jié)了一些:
1. Module類型
分為ability類型和Library類型
ability類型(重點(diǎn)知道什么是HAP)
用于實(shí)現(xiàn)應(yīng)用的功能和特性。每一個(gè)Ability類型的Module編譯后,會(huì)生成一個(gè)以.hap為后綴的文件,我們稱其為HAP(Harmony Ability Package)包。HAP包可以獨(dú)立安裝和運(yùn)行,是應(yīng)用安裝的基本單位,一個(gè)應(yīng)用中可以包含一個(gè)或多個(gè)HAP包,具體包含如下兩種類型。
entry類型的Module:應(yīng)用的主模塊,包含應(yīng)用的入口界面、入口圖標(biāo)和主功能特性,編譯后生成entry類型的HAP。每一個(gè)應(yīng)用分發(fā)到同一類型的設(shè)備上的應(yīng)用程序包,只能包含唯一一個(gè)entry類型的HAP。feature類型的Module:應(yīng)用的動(dòng)態(tài)特性模塊,編譯后生成feature類型的HAP。一個(gè)應(yīng)用中可以包含一個(gè)或多個(gè)feature類型的HAP,也可以不包含。
Library類型的Module:?(HAR、HSP)
用于實(shí)現(xiàn)代碼和資源的共享。同一個(gè)Library類型的Module可以被其他的Module多次引用,合理地使用該類型的Module,能夠降低開發(fā)和維護(hù)成本。Library類型的Module分為Static和Shared兩種類型,編譯后會(huì)生成共享包。
Static Library:靜態(tài)共享庫(kù)。編譯后會(huì)生成一個(gè)以.har為后綴的文件,即靜態(tài)共享包HAR(Harmony Archive)。Shared Library:動(dòng)態(tài)共享庫(kù)。編譯后會(huì)生成一個(gè)以.hsp為后綴的文件,即動(dòng)態(tài)共享包HSP(Harmony Shared Package)。
?說(shuō)明
實(shí)際上,Shared Library編譯后除了會(huì)生成一個(gè).hsp文件,還會(huì)生成一個(gè).har文件。這個(gè).har文件中包含了HSP對(duì)外導(dǎo)出的接口,應(yīng)用中的其他模塊需要通過.har文件來(lái)引用HSP的功能。為了表述方便,我們通常認(rèn)為Shared Library編譯后生成HSP。
HAR與HSP兩種共享包的主要區(qū)別體現(xiàn)在:
共享包類型編譯和運(yùn)行方式發(fā)布和引用方式HARHAR中的代碼和資源跟隨使用方編譯,如果有多個(gè)使用方,它們的編譯產(chǎn)物中會(huì)存在多份相同拷貝。HAR除了支持應(yīng)用內(nèi)引用,還可以獨(dú)立打包發(fā)布,供其他應(yīng)用引用。HSPHSP中的代碼和資源可以獨(dú)立編譯,運(yùn)行時(shí)在一個(gè)進(jìn)程中代碼也只會(huì)存在一份。HSP一般隨應(yīng)用進(jìn)行打包,當(dāng)前只支持應(yīng)用內(nèi)引用,不支持獨(dú)立發(fā)布和跨應(yīng)用的引用。
?HAR和HSP在APP包中的形態(tài)示意圖
2.?Arkts相關(guān)(如果兄弟們精通ts可省略)
文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/introduction-to-arkts-V5
自定義組件:@Component裝飾的UI單元,可以組合多個(gè)系統(tǒng)組件實(shí)現(xiàn)UI的復(fù)用,可以調(diào)用組件的生命周期。 頁(yè)面:即應(yīng)用的UI頁(yè)面??梢杂梢粋€(gè)或者多個(gè)自定義組件組成,@Entry裝飾的自定義組件為頁(yè)面的入口組件,即頁(yè)面的根節(jié)點(diǎn),一個(gè)頁(yè)面有且僅能有一個(gè)@Entry。只有被@Entry裝飾的組件才可以調(diào)用頁(yè)面的生命周期。
頁(yè)面生命周期,即被@Entry裝飾的組件生命周期,提供以下生命周期接口:
onPageShow:頁(yè)面每次顯示時(shí)觸發(fā)一次,包括路由過程、應(yīng)用進(jìn)入前臺(tái)等場(chǎng)景。 onPageHide:頁(yè)面每次隱藏時(shí)觸發(fā)一次,包括路由過程、應(yīng)用進(jìn)入后臺(tái)等場(chǎng)景。 onBackPress:當(dāng)用戶點(diǎn)擊返回按鈕時(shí)觸發(fā)。
組件生命周期,即一般用@Component裝飾的自定義組件的生命周期,提供以下生命周期接口:
aboutToAppear:組件即將出現(xiàn)時(shí)回調(diào)該接口,具體時(shí)機(jī)為在創(chuàng)建自定義組件的新實(shí)例后,在執(zhí)行其build()函數(shù)之前執(zhí)行。 onDidBuild:組件build()函數(shù)執(zhí)行完成之后回調(diào)該接口,不建議在onDidBuild函數(shù)中更改狀態(tài)變量、使用animateTo等功能,這可能會(huì)導(dǎo)致不穩(wěn)定的UI表現(xiàn)。 aboutToDisappear:aboutToDisappear函數(shù)在自定義組件析構(gòu)銷毀之前執(zhí)行。不允許在aboutToDisappear函數(shù)中改變狀態(tài)變量,特別是@Link變量的修改可能會(huì)導(dǎo)致應(yīng)用程序行為不穩(wěn)定。
生命周期流程如下圖所示,下圖展示的是被@Entry裝飾的組件(頁(yè)面)生命周期。
根據(jù)上面的流程圖,我們從自定義組件的初始創(chuàng)建、重新渲染和刪除來(lái)詳細(xì)解釋。
3.自定義組件的創(chuàng)建和渲染流程
自定義組件的創(chuàng)建:自定義組件的實(shí)例由ArkUI框架創(chuàng)建。 初始化自定義組件的成員變量:通過本地默認(rèn)值或者構(gòu)造方法傳遞參數(shù)來(lái)初始化自定義組件的成員變量,初始化順序?yàn)槌蓡T變量的定義順序。 如果開發(fā)者定義了aboutToAppear,則執(zhí)行aboutToAppear方法。 在首次渲染的時(shí)候,執(zhí)行build方法渲染系統(tǒng)組件,如果子組件為自定義組件,則創(chuàng)建自定義組件的實(shí)例。在首次渲染的過程中,框架會(huì)記錄狀態(tài)變量和組件的映射關(guān)系,當(dāng)狀態(tài)變量改變時(shí),驅(qū)動(dòng)其相關(guān)的組件刷新。 如果開發(fā)者定義了onDidBuild,則執(zhí)行onDidBuild方法。
4. 自定義組件重新渲染
當(dāng)事件句柄被觸發(fā)(比如設(shè)置了點(diǎn)擊事件,即觸發(fā)點(diǎn)擊事件)改變了狀態(tài)變量時(shí),或者LocalStorage / AppStorage中的屬性更改,并導(dǎo)致綁定的狀態(tài)變量更改其值時(shí):
框架觀察到了變化,將啟動(dòng)重新渲染。 根據(jù)框架持有的兩個(gè)map(自定義組件的創(chuàng)建和渲染流程中第4步),框架可以知道該狀態(tài)變量管理了哪些UI組件,以及這些UI組件對(duì)應(yīng)的更新函數(shù)。執(zhí)行這些UI組件的更新函數(shù),實(shí)現(xiàn)最小化更新。
5. 自定義組件的刪除
如果if組件的分支改變,或者ForEach循環(huán)渲染中數(shù)組的個(gè)數(shù)改變,組件將被刪除:
在刪除組件之前,將調(diào)用其aboutToDisappear生命周期函數(shù),標(biāo)記著該節(jié)點(diǎn)將要被銷毀。ArkUI的節(jié)點(diǎn)刪除機(jī)制是:后端節(jié)點(diǎn)直接從組件樹上摘下,后端節(jié)點(diǎn)被銷毀,對(duì)前端節(jié)點(diǎn)解引用,前端節(jié)點(diǎn)已經(jīng)沒有引用時(shí),將被JS虛擬機(jī)垃圾回收。 自定義組件和它的變量將被刪除,如果其有同步的變量,比如@Link、@Prop、@StorageLink,將從同步源上取消注冊(cè)。
不建議在生命周期aboutToDisappear內(nèi)使用async await,如果在生命周期的aboutToDisappear使用異步操作(Promise或者回調(diào)方法),自定義組件將被保留在Promise的閉包中,直到回調(diào)方法被執(zhí)行完,這個(gè)行為阻止了自定義組件的垃圾回收。
以下示例展示了生命周期的調(diào)用時(shí)機(jī):
// Index.ets
import router from '@ohos.router';
@Entry
@Component
struct MyComponent {
@State showChild: boolean = true;
@State btnColor:string = "#FF007DFF"
// 只有被@Entry裝飾的組件才可以調(diào)用頁(yè)面的生命周期
onPageShow() {
console.info('Index onPageShow');
}
// 只有被@Entry裝飾的組件才可以調(diào)用頁(yè)面的生命周期
onPageHide() {
console.info('Index onPageHide');
}
// 只有被@Entry裝飾的組件才可以調(diào)用頁(yè)面的生命周期
onBackPress() {
console.info('Index onBackPress');
this.btnColor ="#FFEE0606"
return true // 返回true表示頁(yè)面自己處理返回邏輯,不進(jìn)行頁(yè)面路由;返回false表示使用默認(rèn)的路由返回邏輯,不設(shè)置返回值按照f(shuō)alse處理
}
// 組件生命周期
aboutToAppear() {
console.info('MyComponent aboutToAppear');
}
// 組件生命周期
onDidBuild() {
console.info('MyComponent onDidBuild');
}
// 組件生命周期
aboutToDisappear() {
console.info('MyComponent aboutToDisappear');
}
build() {
Column() {
// this.showChild為true,創(chuàng)建Child子組件,執(zhí)行Child aboutToAppear
if (this.showChild) {
Child()
}
// this.showChild為false,刪除Child子組件,執(zhí)行Child aboutToDisappear
Button('delete Child')
.margin(20)
.backgroundColor(this.btnColor)
.onClick(() => {
this.showChild = false;
})
// push到page頁(yè)面,執(zhí)行onPageHide
Button('push to next page')
.onClick(() => {
router.pushUrl({ url: 'pages/page' });
})
}
}
}
@Component
struct Child {
@State title: string = 'Hello World';
// 組件生命周期
aboutToDisappear() {
console.info('[lifeCycle] Child aboutToDisappear')
}
// 組件生命周期
onDidBuild() {
console.info('[lifeCycle] Child onDidBuild');
}
// 組件生命周期
aboutToAppear() {
console.info('[lifeCycle] Child aboutToAppear')
}
build() {
Text(this.title).fontSize(50).margin(20).onClick(() => {
this.title = 'Hello ArkUI';
})
}
}
// page.ets
@Entry
@Component
struct page {
@State textColor: Color = Color.Black;
@State num: number = 0
onPageShow() {
this.num = 5
}
onPageHide() {
console.log("page onPageHide");
}
onBackPress() { // 不設(shè)置返回值按照f(shuō)alse處理
this.textColor = Color.Grey
this.num = 0
}
aboutToAppear() {
this.textColor = Color.Blue
}
build() {
Column() {
Text(`num 的值為:${this.num}`)
.fontSize(30)
.fontWeight(FontWeight.Bold)
.fontColor(this.textColor)
.margin(20)
.onClick(() => {
this.num += 5
})
}
.width('100%')
}
}
以上示例中,Index頁(yè)面包含兩個(gè)自定義組件,一個(gè)是被@Entry裝飾的MyComponent,也是頁(yè)面的入口組件,即頁(yè)面的根節(jié)點(diǎn);一個(gè)是Child,是MyComponent的子組件。只有@Entry裝飾的節(jié)點(diǎn)才可以使頁(yè)面級(jí)別的生命周期方法生效,因此在MyComponent中聲明當(dāng)前Index頁(yè)面的頁(yè)面生命周期函數(shù)(onPageShow / onPageHide / onBackPress)。MyComponent和其子組件Child分別聲明了各自的組件級(jí)別生命周期函數(shù)(aboutToAppear / onDidBuild/aboutToDisappear)。
應(yīng)用冷啟動(dòng)的初始化流程為:MyComponent aboutToAppear --> MyComponent build --> MyComponent onDidBuild--> Child aboutToAppear --> Child build --> Child onDidBuild --> Index onPageShow。 點(diǎn)擊“delete Child”,if綁定的this.showChild變成false,刪除Child組件,會(huì)執(zhí)行Child aboutToDisappear方法。 點(diǎn)擊“push to next page”,調(diào)用router.pushUrl接口,跳轉(zhuǎn)到另外一個(gè)頁(yè)面,當(dāng)前Index頁(yè)面隱藏,執(zhí)行頁(yè)面生命周期Index onPageHide。此處調(diào)用的是router.pushUrl接口,Index頁(yè)面被隱藏,并沒有銷毀,所以只調(diào)用onPageHide。跳轉(zhuǎn)到新頁(yè)面后,執(zhí)行初始化新頁(yè)面的生命周期的流程。 如果調(diào)用的是router.replaceUrl,則當(dāng)前Index頁(yè)面被銷毀,執(zhí)行的生命周期流程將變?yōu)椋篒ndex onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。上文已經(jīng)提到,組件的銷毀是從組件樹上直接摘下子樹,所以先調(diào)用父組件的aboutToDisappear,再調(diào)用子組件的aboutToDisappear,然后執(zhí)行初始化新頁(yè)面的生命周期流程。 點(diǎn)擊返回按鈕,觸發(fā)頁(yè)面生命周期Index onBackPress,且觸發(fā)返回一個(gè)頁(yè)面后會(huì)導(dǎo)致當(dāng)前Index頁(yè)面被銷毀。 最小化應(yīng)用或者應(yīng)用進(jìn)入后臺(tái),觸發(fā)Index onPageHide。當(dāng)前Index頁(yè)面沒有被銷毀,所以并不會(huì)執(zhí)行組件的aboutToDisappear。應(yīng)用回到前臺(tái),執(zhí)行Index onPageShow。 退出應(yīng)用,執(zhí)行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。
6. 自定義組件的凍結(jié)功能(要了解)
定義組件處于非激活狀態(tài)時(shí),狀態(tài)變量將不響應(yīng)更新,即@Watch不會(huì)調(diào)用,狀態(tài)變量關(guān)聯(lián)的節(jié)點(diǎn)不會(huì)刷新。通過freezeWhenInactive屬性來(lái)決定是否使用凍結(jié)功能,不傳參數(shù)時(shí)默認(rèn)不使用。支持的場(chǎng)景有:頁(yè)面路由,TabContent,LazyforEach,Navigation。
說(shuō)明
從API version 11開始,支持自定義組件凍結(jié)功能。?
7.?常用裝飾器
@Builder裝飾器:自定義構(gòu)建函數(shù)
@BuilderParam裝飾器:引用@Builder函數(shù)
@Styles裝飾器:定義組件重用樣式
@Extend裝飾器:定義擴(kuò)展組件樣式?
8.?狀態(tài)管理
組件狀態(tài)
@State:@State裝飾的變量擁有其所屬組件的狀態(tài),可以作為其子組件單向和雙向同步的數(shù)據(jù)源。當(dāng)其數(shù)值改變時(shí),會(huì)引起相關(guān)組件的渲染刷新。 @Prop:@Prop裝飾的變量可以和父組件建立單向同步關(guān)系,@Prop裝飾的變量是可變的,但修改不會(huì)同步回父組件。 @Link:@Link裝飾的變量可以和父組件建立雙向同步關(guān)系,子組件中@Link裝飾變量的修改會(huì)同步給父組件中建立雙向數(shù)據(jù)綁定的數(shù)據(jù)源,父組件的更新也會(huì)同步給@Link裝飾的變量。 @Provide/@Consume:@Provide/@Consume裝飾的變量用于跨組件層級(jí)(多層組件)同步狀態(tài)變量,可以不需要通過參數(shù)命名機(jī)制傳遞,通過alias(別名)或者屬性名綁定。 @Observed:@Observed裝飾class,需要觀察多層嵌套場(chǎng)景的class需要被@Observed裝飾。單獨(dú)使用@Observed沒有任何作用,需要和@ObjectLink、@Prop聯(lián)用。 @ObjectLink:@ObjectLink裝飾的變量接收@Observed裝飾的class的實(shí)例,應(yīng)用于觀察多層嵌套場(chǎng)景,和父組件的數(shù)據(jù)源構(gòu)建雙向同步。
?應(yīng)用狀態(tài)
AppStorage是應(yīng)用程序中的一個(gè)特殊的單例LocalStorage對(duì)象,是應(yīng)用級(jí)的數(shù)據(jù)庫(kù),和進(jìn)程綁定,通過@StorageProp和@StorageLink裝飾器可以和組件聯(lián)動(dòng)。 AppStorage是應(yīng)用狀態(tài)的“中樞”,將需要與組件(UI)交互的數(shù)據(jù)存入AppStorage,比如持久化數(shù)據(jù)PersistentStorage和環(huán)境變量Environment。UI再通過AppStorage提供的裝飾器或者API接口,訪問這些數(shù)據(jù)。 框架還提供了LocalStorage,AppStorage是LocalStorage特殊的單例。LocalStorage是應(yīng)用程序聲明的應(yīng)用狀態(tài)的內(nèi)存“數(shù)據(jù)庫(kù)”,通常用于頁(yè)面級(jí)的狀態(tài)共享,通過@LocalStorageProp和@LocalStorageLink裝飾器可以和UI聯(lián)動(dòng)。
UI層面
布局種類:
線性布局 (Row/Column)層疊布局 (Stack)彈性布局 (Flex)相對(duì)布局 (RelativeContainer)柵格布局 (GridRow/GridCol)媒體查詢 (@ohos.mediaquery)創(chuàng)建列表 (List)創(chuàng)建網(wǎng)格 (Grid/GridItem)創(chuàng)建輪播 (Swiper)選項(xiàng)卡 (Tabs)
常用組件
按鈕 (Button)單選框 (Radio)切換按鈕 (Toggle)進(jìn)度條 (Progress)文本顯示 (Text/Span)文本輸入 (TextInput/TextArea)顯示圖片 (Image)自定義彈窗 (CustomDialog)視頻播放 (Video)自定義繪制 (XComponent)Native XComponent
?頁(yè)面路由
文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-routing-V5
鴻蒙中嵌套web(有時(shí)間可以了解,只在一次面試中問到)
文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ui-js-overview-V5
?最后在簡(jiǎn)歷層面我再淺說(shuō)幾點(diǎn):
1.?要寫上鴻蒙的經(jīng)驗(yàn),最少一年吧。為什么這么寫,兄弟們要明白,你第一關(guān)要過的是HR,至于面試官信不信那不重要,面試官關(guān)注的是技術(shù)點(diǎn)。
2.?在個(gè)人優(yōu)勢(shì)里要盡量寫鴻蒙相關(guān)的內(nèi)容,基礎(chǔ)也要寫。還是那句話HR要看。
3.?面試的時(shí)候會(huì)就是會(huì),不會(huì)就是不會(huì)。鴻蒙都是剛起步,不會(huì)不丟人,不要模棱兩可。
4.?面試的時(shí)候語(yǔ)速要慢,盡量表達(dá)清晰。要自己先相信自己才能讓面試官認(rèn)可自己
5.?大家都是打工的,都是為了一個(gè)共同的方向在努力,沒必要怯場(chǎng),說(shuō)話要平等大大方方的很重要
最后預(yù)祝大家面試成功!
如果兄弟們想一起學(xué)習(xí)鴻蒙,或者有面試相關(guān)的問題,簡(jiǎn)歷問題,或者想一起分享總結(jié)的??梢栽u(píng)論區(qū)留言,加個(gè)聯(lián)系方式,也可以私信弟弟。寒冬雖寒,但只要我們抱團(tuán)取暖,總有那一線生機(jī)。
柚子快報(bào)激活碼778899分享:職場(chǎng)和發(fā)展 鴻蒙面試心得
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。