日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kylinH5框架之项目组件理解

發布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(){}], }

支持的生命周期方法名如下,beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、?beforeDestroy、destroyed。

Watch

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

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

用法

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

function Watch( key: string [, option: Object = {} ] ): PropertyDecorator 參數名類型用途
keystring監聽的參數名,來自?computed、data、props三者之一。
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>

?

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

?

?

?

?

?

總結

以上是生活随笔為你收集整理的kylinH5框架之项目组件理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。