在Amaple單頁應(yīng)用中,一個(gè)頁面其實(shí)存在兩種模塊化單位,分別是
模塊 (am.Module類),它是以web單頁應(yīng)用跳轉(zhuǎn)更新為最小單位所拆分的獨(dú)立塊;
組件 (am.Component類),它的定位是擁有特定功能的封裝塊,就像由一堆代碼封裝成的具有特定功能的函數(shù)一樣,一個(gè)組件也有獨(dú)立的視圖、狀態(tài)數(shù)據(jù)對(duì)象、組件行為以及生命周期。常用的組件有Dialog、Bubble、Navigator和Menubar等。
在模塊中定義并使用一個(gè)簡單的組件衍生類使用am.class類構(gòu)造器繼承am.Component類定義一個(gè)組件,而繼承am.Component創(chuàng)建的類被稱為 組件衍生類 ,你可以這樣定義一個(gè)組件衍生類:
// 在am.class函數(shù)的參數(shù)中指定該組件衍生類的類名,它返回指定名稱的組件衍生類
// 類名須遵循首字母大寫的駝峰式命名規(guī)范,如"BubbleDemo",否則將會(huì)報(bào)錯(cuò)。但接收變量名沒有限制
var BubbleDemo = am.class ( "BubbleDemo" ).extends ( am.Component ) ( {
// 在init函數(shù)返回該組件的狀態(tài)數(shù)據(jù)對(duì)象
init : function () {
return {
bubbleText: "this is a component bubble"
};
},
// 組件中必須定義render函數(shù),在該函數(shù)中指定組件的template模板和樣式
render : function () {
this.template ( "{{ bubbleText }}" )
.style ( {
span: { background: "red", fontSize: 20, padding: "10px 16px" }
// !注意:當(dāng)元素選擇器為符合變量命名規(guī)則時(shí)可不用引號(hào),如上面選擇span元素時(shí)。當(dāng)選擇器不符合變量名規(guī)則時(shí)需使用引號(hào),如:
// ".class-name": { fontSize: 15 }
// "span #id": { margin-top: 24 }
} );
// this.template ( templateHTML )函數(shù)中傳入html字符串來定義該組件的視圖
// this.style ( styleObj )函數(shù)為該組件的視圖定義樣式,這些樣式也只作用于組件視圖
// 需注意的是該函數(shù)傳入一個(gè)對(duì)象,對(duì)象屬性名為css選擇器語法,值為css樣式對(duì)象,樣式名也是使用駝峰式表示,樣式值為量值時(shí)可直接寫為數(shù)字
}
} );
在一個(gè)模塊中使用 組件衍生類 渲染組件視圖也是非常簡單的,首先在am.startRouter函數(shù)中配置組件加載的baseURL:
am.startRouter ( { baseURL : { // ... // 為組件文件設(shè)置base路徑,所有的組件文件請求路徑都將基于“/component”目錄,不設(shè)置時(shí)默認(rèn)“/” component: "/component" }, // ... } );
然后在需要使用的模塊或組件中通過import函數(shù)引入,并在中通過自動(dòng)以標(biāo)簽名來使用組件
組件生命周期
與模塊生命周期階段數(shù)一樣,一個(gè)組件從創(chuàng)建到卸載也分為5個(gè)階段的生命周期,具體如下:
init:組件初始化時(shí)觸發(fā),它返回組件模板解析與掛載所使用的狀態(tài)數(shù)據(jù)。init函數(shù)內(nèi)可調(diào)用this.propsType函數(shù)進(jìn)行props參數(shù)驗(yàn)證。
props相關(guān)知識(shí)將在本章節(jié)的后面部分介紹
render:渲染組件視圖時(shí)觸發(fā),該生命周期函數(shù)內(nèi)可分別調(diào)用this.template函數(shù)定義視圖標(biāo)簽的字符串,和this.style函數(shù)為組件視圖添加樣式
mounted:解析并掛載狀態(tài)數(shù)據(jù)到組件視圖后觸發(fā),你可以在此函數(shù)中處理一些視圖解析完成后的操作,如為此組件請求網(wǎng)絡(luò)數(shù)據(jù)并更新到模板等
updated:當(dāng)組件在頁面中的位置改變時(shí)觸發(fā),在組件上使用:for指令時(shí)將會(huì)渲染多個(gè)組件,此時(shí)改變:for指令所綁定的狀態(tài)數(shù)組時(shí)將可能改變組件的位置
unmount:組件卸載時(shí)觸發(fā),有兩種情況將會(huì)卸載組件:
①. 通過:for指令渲染多個(gè)組件視圖后,調(diào)用綁定的狀態(tài)數(shù)組的變異函數(shù)都可能在頁面上卸載一個(gè)或多個(gè)組件;
②. 當(dāng)一個(gè)模塊或組件被卸載時(shí),該模塊或組件中的組件也將會(huì)卸載。
我們已經(jīng)知道組件是一個(gè)擁有特定功能的封裝塊,所以它會(huì)有自己特定的 組件行為 ,如Dialog組件有打開和關(guān)閉行為,輪播圖組件有翻頁行為等。你可以這樣定義 組件行為 :
var Dialog = am.class ( "Dialog" ).extends ( am.Component ) ( { init : function () { return { open: false, text: "" }; }, render : function () { this.template ( [ "# 組件行為的兩種使用方法", "{{ text }}", "" ].join ( "" ) ); }, // 添加action成員函數(shù),該函數(shù)返回組件行為的函數(shù)集合對(duì)象,該對(duì)象被稱為組件行為對(duì)象 // action函數(shù)的this指針也是指向該組件對(duì)象本身 action : function () { var _this = this; return { // 組件行為函數(shù)的this指針不會(huì)指向任何值 // 通過state.open來控制Dialog視圖的隱藏與顯示 open: function ( text ) { _this.state.text = text; _this.state.open = true; }, close: function () { _this.state.open = false; } }; } } );
[1]在組件的生命周期函數(shù)mounted、update和unmount中可通過this.action使用組件行為對(duì)象;
[2]在組件元素上使用:ref指令,調(diào)用module.refs函數(shù)獲取組件引用時(shí)將返回該組件的組件行為對(duì)象。
嵌套組件組件與組件之間配合使用可以發(fā)揮更強(qiáng)大的組件能力,在一個(gè)組件的模板中可以嵌套其他組件,你可以這樣寫:
// ComponentB組件依賴ComponentA組件 // ComponentA組件的編寫與普通組件編寫相同,這里省略 var CompoenntB = am.class ( "CompoenntB" ).extends ( am.Component ) ( { // 在構(gòu)造函數(shù)中通過this.depComponents來指定該組件的依賴組件數(shù)組 constructor : function () { // 和ES6的class關(guān)鍵字定義類一樣,在構(gòu)造函數(shù)中需首先調(diào)用super()函數(shù),否則將會(huì)拋出錯(cuò)誤 this.__super (); this.depComponents = [ ComponentA ]; }, init : function () { ... }, render : function () { this.template ( "" ); } } );
當(dāng)ComponentA和ComponentB組件都編寫在多帶帶的文件中時(shí),你需要在模塊中同時(shí)引入 組件 及 嵌套組件 ,像這樣:
...組件與組件、組件與模塊之間的通信
組件作為一個(gè)多帶帶的封裝塊,它必須與其他組件或模塊進(jìn)行通信,你可以在模塊中分發(fā)數(shù)據(jù)到不同組件,也可以在組件中分發(fā)數(shù)據(jù)到嵌套組件中。在組件中可以使用props進(jìn)行數(shù)據(jù)的通信,使用subElements進(jìn)行html模板塊分發(fā)。
# 使用props傳遞靜態(tài)值# 使用props傳遞動(dòng)態(tài)值
props還支持使用插值表達(dá)式的方式傳遞狀態(tài)數(shù)據(jù),這被稱為 動(dòng)態(tài)props 。動(dòng)態(tài)props將創(chuàng)建一個(gè)對(duì)外部狀態(tài)數(shù)據(jù)的代理屬性,當(dāng)在組件內(nèi)更改了此代理屬性時(shí),外部對(duì)應(yīng)的狀態(tài)數(shù)據(jù)也將同步更新。如下:
在使用Dialog組件的視圖中,將狀態(tài)屬性text傳入組件后,組件的this.props.text即為該狀態(tài)屬性的代理屬性。
在Dialog組件的代碼中,可通過this.props.text獲取外部傳遞的text狀態(tài)屬性。
am.class ( "Dialog" ).extends ( am.Component ) ( { init : function () { return { // 使用text1接收并使用this.props.text的值 text1: this.props.text, // 如果你希望更新外部的text屬性后,組件視圖中掛載了this.props.text數(shù)據(jù)的地方也同步更新, // 你可以在組件中創(chuàng)建一個(gè)計(jì)算屬性作為this.props.text的代理,如下創(chuàng)建的text2計(jì)算屬性: computed: { var _this = this; text2: { get: function () { return _this.props.text; }, set: function ( newVal ) { _this.props.text = newVal; } } // 因?yàn)榻M件內(nèi)對(duì)this.props.text的值更新后,外部的text狀態(tài)屬性也會(huì)同步更新,反之也成立 // 這樣在組件視圖中掛載text2就等于掛載props.text // 此時(shí)需注意的是,更改text2的值也將同步更改外部text屬性的值 } }; }, // ... } );# props驗(yàn)證
當(dāng)你希望開放你所編寫的組件給其他開發(fā)者使用時(shí),你不確定其他開發(fā)者傳入的props參數(shù)是否符合組件內(nèi)的處理要求,此時(shí)你可以為你的組件設(shè)置props數(shù)據(jù)驗(yàn)證,你可以在組件的init函數(shù)內(nèi)調(diào)用this.propsType函數(shù)進(jìn)行驗(yàn)證:
am.class ( "Dialog" ).extends ( am.Component ) ( { init : function () { // 每項(xiàng)值的驗(yàn)證都可以設(shè)置validate、require和default屬性 this.propsType ( { text: { validate: String, // 表示當(dāng)傳入text值時(shí)它必須為字符串 require: true, // 表示text參數(shù)為必須傳入的參數(shù),默認(rèn)為false default: "Have no message" // 表示不傳入text參數(shù)時(shí)的默認(rèn)值,默認(rèn)值不會(huì)參與props驗(yàn)證,不指定default時(shí)無默認(rèn)值 // validate的值可以有四種類型的參數(shù),分別為: // ①. 基礎(chǔ)數(shù)據(jù)構(gòu)造函數(shù),分別有String、Number、Boolean三種基本數(shù)據(jù)類型構(gòu)造函數(shù),F(xiàn)unction、Object、Array三種引用類型構(gòu)造函數(shù), // 以及undefined和null,它表示允許傳入的數(shù)據(jù)類型 // ②. 正則表達(dá)式,如/^1d{10}$/表示只允許傳入一個(gè)手機(jī)號(hào)碼 // ③. 函數(shù),它接收此props參數(shù)值,必須返回true或false表示是否通過驗(yàn)證,如: // function ( text ) { return text.length > 5 } // ④. 數(shù)組,數(shù)組內(nèi)是以上三種值的組合,通過數(shù)組內(nèi)任意一項(xiàng)驗(yàn)證都可以通過,相當(dāng)于“||”運(yùn)算符 } // 當(dāng)text屬性驗(yàn)證只要設(shè)置validate屬性時(shí),可直接如下縮寫: // text: String } ); return { text: this.props.text }; }, // ... } );使用subElements分發(fā)html片段
如果你想開發(fā)一個(gè)更加通用的Dialog組件,你應(yīng)該不希望Dialog的視圖布局是固定不變的,而是可以根據(jù)不同的需求自定義Dialog視圖,因?yàn)檫@樣才顯得更加靈活多變,組件的subElements就是用來解決這個(gè)問題的,它可以使你從組件外部傳入html片段與組件視圖混合:
然后在組件內(nèi)通過subElements屬性獲取外部傳遞的視圖,并插入到組件視圖中的任意位置。subElement接收的視圖可分為 默認(rèn)subElements 、 subElements的單數(shù)分塊 和 subElements的不定數(shù)分塊 三種形式。
# 默認(rèn)subElements在組件元素中傳入html片段時(shí),組件內(nèi)將會(huì)創(chuàng)建一個(gè)默認(rèn)的subElements局部變量,你可以在組件內(nèi)的模板中通過{{ subElements.default }}插入此html片段:
am.class ( "Dialog" ).extends ( am.Component ) ( { init : function () { ... }, render : function () { // {{ subElements.default }}將會(huì)輸出外部傳入的“this is external HTML template” this.template ( "{{ subElements.default }}" ); } // ... } );
Dialog組件將會(huì)被渲染成:
this is external HTML template
【注意】分發(fā)的html片段也可以使用模板指令與組件,此html片段解析時(shí)掛載的數(shù)據(jù)來源是組件外部的狀態(tài)數(shù)據(jù),如下:
# subElements的單數(shù)分塊
如果你希望開發(fā)的Dialog分為頭部和內(nèi)容兩部分視圖,再混合到組件模板的不同位置,subElements也允許你這樣編寫html片段:
am.class ( "Dialog" ).extends ( am.Component ) ( { init : function () { ... }, render : function () { // 指定分塊的組件子元素名 // 組件子元素名也需遵循首字母大寫的駝峰式規(guī)則,在組件元素內(nèi)使用時(shí)也是全部小寫的中劃線式規(guī)范 this.subElements ( "Header", "Content" ) .template ( [ "", "" ].join ( "" ) ); //{{ subElements.Header }}", "{{ subElements.Content }}", "、 兩個(gè)子元素只能作為
此時(shí)Dialog組件將會(huì)被渲染成:
this is a titlethis is external HTML template
【注意】①. 如沒有在this.subElements函數(shù)中定義相應(yīng)的組件子元素時(shí),Amaple只會(huì)將它們作為普通dom元素對(duì)待。# subElements的不定數(shù)分塊
②. 除、 外的其他html片段會(huì)自動(dòng)包含在subElements.default中。
subElements的分塊分發(fā)可能會(huì)讓你想到很多原生的元素,如 在組件中這樣定義不定數(shù)分塊的subElements: 繼續(xù)學(xué)習(xí)下一節(jié):【AmapleJS教程】5. 插件 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/115595.html 摘要:體驗(yàn)優(yōu)先的單頁框架點(diǎn)此查看倉庫是專為單頁應(yīng)用而設(shè)計(jì)的基于頁面模塊化的框架,它可使開發(fā)者快速開發(fā)單頁應(yīng)用。使用前置要求此框架的使用者可不需了解構(gòu)建工具,但必須掌握和的基礎(chǔ)知識(shí)。
showImg(https://segmentfault.com/img/bV2wO3?w=792&h=303);
Amaple · 體驗(yàn)優(yōu)先的JavaScript單頁框架
Amaple (點(diǎn)此查看Github倉... 摘要:體驗(yàn)優(yōu)先的單頁框架點(diǎn)此查看倉庫是專為單頁應(yīng)用而設(shè)計(jì)的基于頁面模塊化的框架,它可使開發(fā)者快速開發(fā)單頁應(yīng)用。使用前置要求此框架的使用者可不需了解構(gòu)建工具,但必須掌握和的基礎(chǔ)知識(shí)。
showImg(https://segmentfault.com/img/bV2wO3?w=792&h=303);
Amaple · 體驗(yàn)優(yōu)先的JavaScript單頁框架
Amaple (點(diǎn)此查看Github倉... 摘要:體驗(yàn)優(yōu)先的單頁框架點(diǎn)此查看倉庫是專為單頁應(yīng)用而設(shè)計(jì)的基于頁面模塊化的框架,它可使開發(fā)者快速開發(fā)單頁應(yīng)用。使用前置要求此框架的使用者可不需了解構(gòu)建工具,但必須掌握和的基礎(chǔ)知識(shí)。
showImg(https://segmentfault.com/img/bV2wO3?w=792&h=303);
Amaple · 體驗(yàn)優(yōu)先的JavaScript單頁框架
Amaple (點(diǎn)此查看Github倉... 摘要:參數(shù)為循環(huán)遍歷時(shí)的回調(diào)函數(shù),它分別接收遍歷項(xiàng)的值遍歷下表遍歷變量本身三個(gè)參數(shù),當(dāng)回調(diào)函數(shù)返回時(shí)將結(jié)束本次循環(huán),而且此時(shí)執(zhí)行結(jié)束后也將會(huì)返回一個(gè),這在結(jié)束多層循環(huán)遍歷時(shí)很有用,開發(fā)者可以通過再次推出上層循環(huán)。
Amaple 擁有非常強(qiáng)大插件功能,這也是它的突出功能之一,Amaple插件一般表現(xiàn)為功能塊(函數(shù))或功能塊(包含一系列函數(shù)和屬性的Object對(duì)象),它除了支持Amaple規(guī)范... 閱讀 3058·2023-04-26 03:01 閱讀 3547·2023-04-25 19:54 閱讀 1599·2021-11-24 09:39 閱讀 1382·2021-11-19 09:40 閱讀 4261·2021-10-14 09:43 閱讀 2097·2019-08-30 15:56 閱讀 1504·2019-08-30 13:52 閱讀 1669·2019-08-29 13:05和、和、
和
等,他們都屬于包含與被包含的關(guān)系,但你會(huì)發(fā)現(xiàn)其實(shí) 中可以定義一個(gè)或多個(gè),在subElements中你也可以定義一個(gè) 組件子元素 的不定數(shù)分塊,如Grid組件(網(wǎng)格)可包含不定個(gè)數(shù)的GridItem:
am.class ( "Grid" ).extends ( am.Component ) ( {
init : function () { ... },
render : function () {
this.subElements ( { elem: "GridItem", multiple: true } )
.template ( [
"
",
"
"
].join ( "" ) )
.style ( ... );
// 此時(shí)局部變量subElements.GridItem為一個(gè)包含所有GridItem分塊片段的數(shù)組,在組件內(nèi)使用:for指令循環(huán)輸出,
// 也可以使用數(shù)組索引如subElements.GridItem [ 0 ]
// 其實(shí)上面定義單數(shù)分塊的Header的全寫是{ elem: "Header", multiple: false },但它可縮寫為"Header"
}
// ...
} );
也可回顧上一節(jié):【AmapleJS教程】3. 模板指令與狀態(tài)數(shù)據(jù)(state)相關(guān)文章
Amaple.js框架詳細(xì)介紹
Amaple.js框架詳細(xì)介紹
Amaple.js框架詳細(xì)介紹
【Amaple教程】5. 插件
發(fā)表評(píng)論
0條評(píng)論
suosuopuo
男|高級(jí)講師
TA的文章
閱讀更多
tensorflow如何指定gpu
tensorflow分布式訓(xùn)練
什么是linux?Linux需要學(xué)習(xí)什么語言?
C語言基礎(chǔ)——字符串逆序(遞歸實(shí)現(xiàn),不使用庫函數(shù))
五萬字15張導(dǎo)圖Java自學(xué)路線,小白零基礎(chǔ)入門,程序員進(jìn)階,收藏這篇就夠了
React中禁止頁面滾動(dòng)
【Amaple教程】4. 組件
簡易時(shí)鐘動(dòng)畫