kylinH5框架之項目組件理解

目錄

?

組件介紹

組件聲明結構

組件接口

script

dependency

template

style

狀態注入

接口聲明


組件介紹

Component?擴充自?Vue?的組件, 提供了?Vue?組件對等的輸入參數能力。在代碼書寫時提供類?class?的裝飾器?Decorator?風格。

import { Component, Watch } from '@ali/kylin-framework';

一個組件可以包含數據、JSX 渲染函數、模板、掛載元素、方法、生命周期等?Vue?的?options?選項的對等配置。

組件聲明結構

組件聲明包括以下幾部分, 分別使用?@Component?和?@Watch?兩種不同裝飾器進行包裝:

  • class 類聲明, 使用裝飾器?@Component
  • 類成員聲明, 不使用裝飾器。
  • 類成員方法聲明, 一般不裝飾器, 除非該方法需要?watch?另外一個已聲明的變量。

舉例子

<!-- Hello.vue -->
<template><div>hello {{name}}<Child></Child></div>
</template>
<style>/* put style here */
</style>
<component default="Child" src="./child.vue" />
<script>import { Component } from '@ali/kylin-framework';@Componentclass Hello {data = {name: 'world'}}export default Hello;
</script>

組件接口

跟 vue 基本一致,組件定義寫在?.vue?文件內,以下是一個簡單的例子:

<template><div><AButton @click="onClick">點擊</AButton></div>
</template>
<style lang="less" rel="stylesheet/less">/* less */
</style>
<dependency component="{ AButton }" src="@alipay/antui-vue" lazy/>
<script type="text/javascript">import { Component } from '@ali/kylin-framework';@Componentexport default class IndexView {props = {}data = {c:666}get comput() { return this.data.c * 2 }onClick() {}mounted() {}}
</script>

上述例子中,<template><style><script>、<dependency>?? 4 個頂級標簽

其中?<template>、?<style>?與?vue?中定義一致。下文將對這 4 個標簽的具體作用分別進行闡述。

script

1.class 結構

定義一個 Component ,使用類 class 的裝飾器 Decorator 風格。

其中裝飾器有?@Component?和?@Watch?2 種,通過以下方式引入。

import { Component, Watch } from '@ali/kylin-framework';
@Component
export default class Hello {
}

2.方法類型

@Component

組件以 class 形式聲明,必須對該 class 進行裝飾器修飾。

在 class 內部,不需要被手動處理成員變量babel?插件在構建過程中自動進行處理。

而?成員函數?一般不需要裝飾器掛載,除非是使用?@Watch?的場景,其中?@Component?會處理的屬性如下表所示。

成員類型名稱功能
get/set property*用以轉換成?Vue?的?computed?計算屬性,可以直接通過?this[varName]?調用
method生命周期生命周期方法,與?Vue?對等。
method*普通成員方法, 用以轉換成?Vue?的?methods?方法列表。

分別舉例:

getter/setter屬性

@Component 
export default class Hello {get computName() {// to sth}
}

上述?getter?聲明,等價于如下 vue 配置

HelloOption = {computed: {computName: {get: computName() {// to sth}}}
}

同理,setter?也會被提取,如果同時存在?getter?和?setter?則會被一起提取。

生命周期函數

@Component 
export default class Hello {created() {}mounted() {}
}

上述?created?和?mounted?生命周期函數,會被提取為數組。

TestOption = {created: [function created(){}],mounted: [function mounted(){}],
}

支持的生命周期方法名如下,beforeCreatecreatedbeforeMountmountedbeforeUpdateupdated、?beforeDestroydestroyed

Watch

該裝飾器的出現,只是因為?watch?需要有以下幾個要素:

  • 被監聽的變量名
  • 監聽選項
  • 觸發函數

用法

完整的?@Watch?接口如下表所示。

function Watch( key: string [, option: Object = {} ] ): PropertyDecorator
參數名類型用途
keystring監聽的參數名,來自?computeddataprops三者之一。
optiondeepboolean若監聽的是復雜對象,其內層數據變更是否觸發,默認為?false
immediateboolean立即以表達式的當前值觸發回調,默認為?false

示例

  • 對于?@Watch?裝飾的成員函數,支持對成員函數配置多個變量的監聽,如下同時對?a?和?c?的變化進行了監聽,如果任何一個發生變化,會觸發?OnChangeA?成員方法。
  • 如下,OnChangeA?本質是成員方法,所以他也會和其他成員方法一起被提取到methods塊中,那么必須保證沒有與其他方法重名。
  • 如果對Watch有額外配置項,請按?@Watch('a', {deep: false})的方法傳入。配置項請參考?watch配置項。
@Component
class WTest {data = {a: {b: 2},c: 3}@Watch('c')@Watch('a', {deep: true}) OnChangeA(newVal, oldVal) {}
}

注意: 以上對?data.a?的監聽,會轉換成如下形式,需要注意的是,如果沒開啟?deep: true?選項,當?data.a.b?發生變動的時候,不會觸發該?OnChangeA?監聽。

3.屬性類型

構建工具會自動對成員變量應用了?@Component.Property?裝飾器,不需要用戶手動填寫,

最終的合并策略取決于被裝飾的?成員變量?的標識符名稱,框架內置了以下幾種。如果不在下表中,會透傳至?VueComponent?的?options?對象中。

成員類型名稱功能
propertypropsvue的props屬性
propertydatavue的data屬性,會被轉換成函數形式, 支持 this,請勿直接寫?data(){}?函數
property*其他未知屬性,直接復制到?Vue?的?options?中的對應屬性上

props

@Component 
export default class Hello {props = {name: {type: String,default: 'haha'},num: Number}
}

上述?props?成員變量定義,會被直接轉換成到?options?中對應的?props。具體完整定義結構請參見 Vue 文檔?API-props。

HelloOption = {props: {name: {type: String,default: 'haha'},num: Number}
}

data

@Component 
export default class Hello {props = {name: {type: Number,default: 1},}data = {hello: this.props.name + 2}
}

上述?data?成員變量定義,會被轉換成 data 函數形式,您無需手動編寫 data 函數。

TestOption = {props: {name: {type: Number,default: 1}, },data: function data() {return {hello: this.props.name + 2}}
}

dependency

上述?<script>?定義中,沒有說明組件依賴的使用方式,在?.vue?文件中,推薦使用以下寫法來標記組件依賴,即?<dependency>?標簽,下面示例中即引用了?./child.vue?組件。

<template><child></child>
</template>
<dependency component="Child" src="./child.vue" />

標簽屬性

default 導入

針對?ES6 Module?的?default?導出或者?commonjs Module?對象的導出,可使用如下方式引入。

屬性類型默認值備注
componentstring必填引入到?options.components?的標識符名。
srcstring必填組件來源,同require(src)。
lazybooleanfalse是否對該組件啟用懶加載(當且僅當被?Vue?使用到時再進行?require?加載模塊)。
stylestringundefined默認不啟用,如果設置了字符串,會根據?${src}/${style}?的路徑來加載組件對應樣式文件。

如下示例:

<dependency component="name" src="source" lazy />

?

member 導入

針對?ES6 Module?的命名導出,可使用如下方式引入:

屬性類型默認值備注
componentstring必填引入到?options.components?的多個命名標識符, 必須以花括號?{}?包括,否則會識別為?default 引入
srcstring必填組件來源,同 require(src)。
lazybooleanfalse是否對該組組件啟用懶加載(當且僅當被?Vue?使用到時再進行?require?加載模塊)。

如下示例:

<dependency component="{ List, ListItem, AButton }" src="@alipay/antui-vue" lazy />

默認對?@alipay/antui-vue?組件庫支持?babel-plugin-import?按需加載。

template

模板的內容結構與 vue 一致。

<template><div>Hello World</div>
</template>

style

可以通過添加?scoped?屬性標記來使得該樣式只對當前組件生效。

<style lang="less" rel="stylesheet/less" scoped>/* less */
</style>

狀態注入

對于 Kylin 組件, 如果需要使用到?Store?中的屬性,使用計算屬性把?$store?對象中的屬性透傳出來是一種不推薦的寫法,如下所示:

@Component 
class Hello {// 通過計算屬性來關聯store中的狀態get hello() {return this.$store.state.hello}
}

推薦使用下面的?connect?機制來透傳?$store?數據:

  • mapStateToProps
  • mapActionsToMethods
  • mapMethods

接口聲明

@Component({mapStateToProps: Object|Array,mapActionsToMethods: Object|Array,mapMethods: Array|Boolean,mapEvents: Array
})
class Hello {
}

mapStateToProps

把?state?中的特定鍵值映射到當前組件的?props?中,其接收參數等價于?Vuex?提供的?mapState?輔助函數。

有以下 3 種方式可實現上述功能:

函數方式

說明:把?$store.state?中名為?bbb?的數據,映射到名為?aaa?的?props?上。

{mapStateToProps: {aaa: (state, getters) => state.bbb}
}

字符串鍵值對方式

說明:把?$store.state?中名為?bbb?的數據,映射到名為?aaa?的?props?上。

{mapStateToProps: {aaa: 'bbb'}
}

字符串數組方式

說明

  • 把?$store.state?中名為?aaa?的數據,映射到名為?aaa?的?props?上。
  • 把?$store.state?中的名為?bbb?的數據,映射到名為?bbb?的props?上。
{mapStateToProps: ['aaa', 'bbb']
}

mapActionsToMethods

與?Vuex?中?mapActions?入參一致,支持使用對象方式(名稱映射)、數組方式(名稱)把在全局?$store?下配置的?actions?注入到當前組件的?methods?中。

@Component({mapActionsToMethods: ['a', 'b']
})
class IndexView {async doSomeAction() {const ret = await this.a(123);// 等價于調用// const ret = await this.$store.dispatch('a', 123);}
}

mapMethods

通過在父子組件之間加一層中間層組件的方式來具體實現?connect?機制。當父組件調用子組件中特定的?method?方法時,無法直接訪問子組件(實際訪問到的是中間層組件),需要通過以下配置實現訪問。

@Component({mapMethods: true
})
export default class Child {a() {}
}
<template><div>this is parent<child ref="child"></child></div>
</template>
<script>@Componentexport default class Parent {b() {// 此處可以訪問this.$refs.child.a();}}
</script>

?

吐槽:學這個麒麟框架真的像中了佐二助大招雷遁麒麟一樣難受(╯﹏╰)

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247386.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Markdown 語法簡介

這是標題一 標題二 標題三 print(hello) 這是一個python 第一點 thiw dhaishd 第二點 轉載于:https://www.cnblogs.com/BlogOfEr/p/11229682.html

kylinH5框架之項目開發調試

進行開發調試&#xff0c;需要完成以下步驟&#xff1a; 安裝依賴開發調試構建生產 點擊 代碼示例&#xff0c;獲取 Kylin Demo&#xff0c;并完成以下操作。 安裝依賴 進入項目根目錄&#xff0c;使用 cnpm 安裝 npm 依賴&#xff1a; # 安裝npm依賴 cnpm install 開發調試…

Java生鮮電商平臺-深入訂單拆單架構與實戰

Java生鮮電商平臺-深入訂單拆單架構與實戰 Java生鮮電商中在做拆單的需求&#xff0c;細思極恐&#xff0c;思考越深入&#xff0c;就會發現里面涉及的東西越來越多&#xff0c;要想做好訂單拆單的功能&#xff0c;還是相當有難度&#xff0c; 因此總結了一下拆單功能細節&…

python3中Requests將verify設置為False后,取消警告的方式

import requests resp requests.get(https://www.***.com, verifyFalse)調用成功但是會有如下警告信息&#xff1a; InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedo…

kylinH5框架之項目腳手架

頁面介紹 Page 是一個 Webview 的邏輯抽象層&#xff0c;同時也是組件掛載的根節點。 代碼引入 import { Page } from ali/kylin-framework; 頁面聲明結構 一個Page包含的接口在頁面接口中聲明&#xff0c;提供了對 Vue 實例的完整控制能力&#xff0c;簡易的 Page 使用如…

博弈論學習筆記

決定近段時間復習一下博弈論順便寫點筆記。 大佬博客&#xff1a;幾種常見博弈模型https://blog.csdn.net/wr132/article/details/51213331 SG函數與SG定理https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html 無敵的博弈總結https://blog.csdn.net/acm_cxlove/article…

Promise鏈式調用和解決回調地獄的ES7終極解決方法async,await

promise鏈式調用 **then 是成功回調&#xff0c;只要在then后邊return一個promise就可以繼續then**<script type"text/javascript">let p1new Promise(function(resolve,reject){setTimeout(function(){resolve()//成功回調// reject()//失敗回調},2000)//2秒…

1.MySQL目錄結構

分為兩個目錄&#xff1a; 1.安裝目錄&#xff1a; 2.數據目錄&#xff1a; 在Linux下 yum安裝mysql后使用 find / -name my.cnf 找到mysql數據文件的位置 轉載于:https://www.cnblogs.com/sdrbg/p/11237231.html

對promise.all底層的實現的研究

1.Promise.all(iterable)返回一個新的Promise實例,此實例在iterable參數內素有的Promise都fulfilled或者參數中不包含Promise時&#xff0c;狀態變成fulfilled。 如果參數中Promise有一個失敗rejected &#xff0c;此實例回調失敗&#xff0c;失敗原因的是第一個失敗Promise的返…

vue-provide/inject輕松實現跨級訪問祖先組件

provide&#xff1a;Object | () > Object inject&#xff1a;Array<string> | { [key: string]: string | Symbol | Object } provide 和 inject 主要為高階插件/組件庫提供用例。并不推薦直接用于應用程序代碼中。是2.2.0版本 新增的。 這對選項需要一起使用&#x…

python 操作redis,存取為字節格式,避免轉碼加

這種情況連接數據庫&#xff0c;對數據的存取都是字節類型&#xff0c;存取時還得轉碼一下 from redis import Redis# 實例化redis對象rdb Redis(hostlocalhost, port6379, db0,passwordaaa123) rdb.set(name, root) name rdb.get(name) print(name)為了避免上述情況&#x…

element ui table scrollTop 滾動到行頭或行尾

1.設置table的ref為tableList2.設置滾動至頂部this.$refs.tableList.bodyWrapper.scrollTop 0;3.設置滾動至底部this.$refs.tableList.bodyWrapper.scrollTop this.$refs.tableList.bodyWrapper.scrollHeight;//如果請求完更新數據&#xff0c;需要使用$nextTick this.$nextTic…

Element-UI中Drawer抽屜去除標題自帶藍色框

當點擊事件drawertrue時&#xff0c;抽匣回打開 這時抽匣的標題會出現一個難看的藍色邊框&#xff0c;一會就會消失&#xff0c;但是好丑&#xff0c;所以要去掉它 解決方法 /deep/ :focus {outline: 0;} vue組件中&#xff0c;在style設置為scoped的時候&#xff0c;里面在…

Java生鮮電商平臺-B2B生鮮的互聯網思維

Java生鮮電商平臺-B2B生鮮的互聯網思維 在互聯網高速發展的今天&#xff0c;為我們的生活帶來了眾多便利。然而互聯網從早期的萌芽狀態到現在婦孺皆知&#xff0c;它的崛起速度遠遠超乎世人的想象。人們開始關注互聯網并且研究它&#xff0c;而思維模式的研究則是從深層次研究事…

Java生鮮電商平臺-高并發核心技術訂單與庫存實戰

Java生鮮電商平臺-高并發核心技術訂單與庫存實戰 一、 問題 一件商品只有100個庫存&#xff0c;現在有1000或者更多的用戶來購買&#xff0c;每個用戶計劃同時購買1個到幾個不等商品。 如何保證庫存在高并發的場景下是安全的&#xff1f; &#xff08;1&#xff09;不多發 &…

Vue2 MVVM 雙向綁定(數據劫持+發布者-訂閱者模式)

參考文獻&#xff1a;https://www.cnblogs.com/libin-1/p/6893712.html https://juejin.im/post/5b2f0769e51d45589f46949e MVVM拆開來即為Model-View-ViewModel&#xff0c;有View&#xff0c;ViewModel&#xff0c;Model三部分組成。View層代表的是視圖、模版&#xff0c;負…

常用的激活函數

1.階躍函數 &#xff0c;值域{0,1} 1 def step_function(x): 2 return np.array(x>0,dtypenp.int) 2.sigmoid函數 &#xff0c;值域(0,1) 1 def sigmoid(x): 2 return 1/(1np.exp(-x)) 3.relu函數 &#xff0c;值域[0&#xff0c;∞&#xff09; 1 def relu(x): 2 …

前端優化-vue-cli4安裝webpack-bundle-analyzer分析包文件

使用vue-cli3創建了一個工程目錄&#xff0c;技術棧為vue-cli3vue-routervuexelement-uiv-chartsaxios。但是等到項目開發完后&#xff0c;發現生成的app.js特別大&#xff0c;接近10M。為了優化項目性能&#xff0c;需要使用webpack-bundle-analyzer分析包文件&#xff0c;找出…

今天剛查到的宏,學習

PVP常用的宏&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&…

不要再問我三次握手和四次揮手

三次握手和四次揮手是各個公司常見的考點&#xff0c;也具有一定的水平區分度&#xff0c;也被一些面試官作為熱身題。很多小伙伴說這個問題剛開始回答的挺好&#xff0c;但是后面越回答越冒冷汗&#xff0c;最后就歇菜了。 見過比較典型的面試場景是這樣的: 面試官&#xff1…