最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue框架TypeScript裝飾器使用指南小結(jié)

 更新時(shí)間:2019年02月18日 11:48:08   作者:CharlesYu01  
這篇文章主要介紹了Vue框架TypeScript裝飾器使用指南小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

裝飾器是一種特殊類型的聲明,它能夠被附加到 類聲明,方法, 訪問(wèn)符,屬性或參數(shù) 上。 裝飾器使用 @expression這種形式, expression求值 后必須為一個(gè)函數(shù),它會(huì)在 運(yùn)行時(shí)被調(diào)用 ,被裝飾的聲明信息做為參數(shù)傳入。

本篇先從項(xiàng)目的宏觀角度來(lái)總結(jié)一下Decorator如何組織。

目錄

  • 主要的Decorator依賴
    • vue-class-component
    • vuex-class
    • vue-property-decorator
    • core-decorators
  • 自定義Decorator示例
  • 哪些功能適合用Decorator實(shí)現(xiàn)
  • Decorator實(shí)現(xiàn)小Tips
  • See also

主要的Decorator依賴

vue-cli3 默認(rèn)支持Decorator, 年初重寫了一個(gè)design庫(kù)主要依賴官方和社區(qū)提供的Decorator來(lái)實(shí)現(xiàn)的組件。 Decorator可以非侵入的裝飾類、方法、屬性,解耦業(yè)務(wù)邏輯和輔助功能邏輯。以下是主要的三方Decorator組件:

vue-class-component

  • @Component 如果您在聲明組件時(shí)更喜歡基于類的 API,則可以使用官方維護(hù)的 vue-class-component 裝飾器
  • 實(shí)時(shí)計(jì)算computed屬性, get computedMsg () {return 'computed ' + this.msg}
  • 生命周期鉤子 mounted () {this.greet()}

vuex-class

讓Vuex和Vue之間的綁定更清晰和可拓展

  • @State
  • @Getter
  • @Action
  • @Mutation

vue-property-decorator

這個(gè)組件完全依賴于vue-class-component.它具備以下幾個(gè)屬性:

  • @Component (完全繼承于vue-class-component)
  • @Prop:父子組件之間值的傳遞
  • @Emit:子組件向父組件傳遞
  • @Model:雙向綁定
  • @Watch:觀察的表達(dá)式變動(dòng)
  • @Provice:在組件嵌套層級(jí)過(guò)深時(shí)。父組件不便于向子組件傳遞數(shù)據(jù)。就把數(shù)據(jù)通過(guò)Provide傳遞下去。
  • @Inject:然后子組件通過(guò)Inject來(lái)獲取
  • Mixins (在vue-class-component中定義);

core-decorators

  • @readonly
  • @autobind : TSX 回調(diào)函數(shù)中的 this,類的方法默認(rèn)是不會(huì)綁定 this 的,可以使用autobind裝飾器
  • @override

總結(jié)一下主要就分成這三類:

  • 修飾類的:@Component、@autobind;
  • 修飾方法的:@Emit、@Watch、@readonly、@override;
  • 修飾屬性的:@Prop、@readonly;

以上引用方法等詳系內(nèi)容可查看官方文檔。下面自定義部分來(lái)實(shí)現(xiàn)一個(gè)記錄日志功能的裝飾器。

自定義Decorator示例

@Logger,Logger日志裝飾器通常是修飾方法,Decorater則是在 運(yùn)行時(shí)就被觸發(fā)了 ,日志記錄是在 方法被調(diào)用時(shí)觸發(fā) ,示例中通過(guò)自動(dòng)發(fā)布事件實(shí)現(xiàn)調(diào)用時(shí)觸發(fā)。為增加日志記錄的靈活性,需要通過(guò)暴露鉤子函數(shù)的方式來(lái)改變?nèi)罩居涗浀膬?nèi)容。
期望的日志格式

{
  "logId":"", // 事件Id
  "input":"", // 方法輸入的內(nèi)容
  "output":"", // 方法輸出的內(nèi)容
  "custom":"" // 自定義的日志內(nèi)容
}

實(shí)現(xiàn)

export function Logger(logId?: string, hander?: Function) {
  const loggerInfo =Object.seal({logId:logId, input:'',output:'', custom: ''});
  const channelName = '__logger';
  const msgChannel = postal.channel(channelName);
  msgChannel.subscribe(logId, logData => {
    // 根據(jù)業(yè)務(wù)邏輯來(lái)處理日志
    console.log(logData);
  });

  return function (target: any,
    key: string,
    descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> {
      const oldValue = descriptor.value
      descriptor.value = function () {
        const args: Array<any> = [];
        for (let index in arguments) {
        args.push(arguments[index]);
        }
        loggerInfo.input = `${key}(${args.join(',')})`;
        // 執(zhí)行原方法
        const value = oldValue.apply(this, arguments);
        loggerInfo.output = value;
        hander && (loggerInfo.custom = hander(loggerInfo.input, loggerInfo.output) || '');
        // 被調(diào)用時(shí),會(huì)自動(dòng)發(fā)出一個(gè)事件
        msgChannel.publish(logId, loggerInfo);
      }
      return descriptor
  }
}

使用

@Logger('event_get_detial1')
getDetial(id?: string, category?: string) {
  return "詳細(xì)內(nèi)容";
}
// 或者
@Logger('event_get_detial2', (input, output) => {
    return '我是自定義內(nèi)容';
})
getDetial2(id?: string, category?: string) {
  return "詳細(xì)內(nèi)容";
}
...
<button @click="getDetial2('1000', 'a')">獲取詳情</button>

效果: {logId: "event_get_detial2", input: "getDetial(1000,a)", output: "詳細(xì)內(nèi)容", custom: "我是自定義內(nèi)容"} , 每次點(diǎn)擊按鈕都會(huì)觸發(fā)一次。

TODO: 這里還需要對(duì)輸入?yún)?shù)和輸出參數(shù)中的引用數(shù)據(jù)類型做處理。

同時(shí)還需要掌握: 裝飾器工廠、裝飾器組合、裝飾器求值、參數(shù)裝飾器、元數(shù)據(jù)

哪些功能適合用Decorator實(shí)現(xiàn)

官網(wǎng)和社區(qū)提供的這些Decorator, 可以作為自己框架的底層設(shè)計(jì)。

日志功能全局都得用,調(diào)用方法基本一致,是最適合使用裝飾器來(lái)實(shí)現(xiàn),并且每個(gè)項(xiàng)目的日志記錄各有差異,最適合自定義這部分。

Decorator實(shí)現(xiàn)小Tips

  • 考慮下各類Decorator疊加和共存的問(wèn)題,可以參考官網(wǎng)關(guān)于裝飾器組合描述
  • Decorator 的目標(biāo)是在原有功能基礎(chǔ)上,添加功能,切忌覆蓋原有功能
  • 類裝飾器不能用在聲明文件中( .d.ts),也不能用在任何外部上下文中(比如declare的類)
  • 裝飾器只能用于類和類的方法,不能用于函數(shù),因?yàn)榇嬖诤瘮?shù)提升。類是不會(huì)提升的,所以就沒(méi)有這方面的問(wèn)題。
  • 注意遷移速度、避免一口吃成胖子的做法
  • 不要另起爐灶對(duì)主流庫(kù)創(chuàng)建Decorator庫(kù),主流庫(kù)維護(hù)成本很高還是得有官方來(lái)維護(hù),為保證質(zhì)量不使用個(gè)人編寫的Decorator庫(kù)。自己在創(chuàng)建Decorator庫(kù)時(shí)也要有這個(gè)意識(shí),僅做一些有必要自定義的。
  • Decorator 不是管道模式,decorator之間不存在交互,所以必須注意保持decorator獨(dú)立性、透明性
  • Decorator 更適用于非業(yè)務(wù)功能需求
  • 確定 decorator 的用途后,切記執(zhí)行判斷參數(shù)類型
  • decorator 針對(duì)每個(gè)裝飾目標(biāo),僅執(zhí)行一次

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vuex模塊化與持久化深入講解

    Vuex模塊化與持久化深入講解

    在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,如果公共數(shù)據(jù)比較多我們會(huì)使用vuex做公共狀態(tài)管理,但是在對(duì)瀏覽器進(jìn)行刷新操作的時(shí)候,會(huì)導(dǎo)致vuex內(nèi)的數(shù)據(jù)丟失,這種情況有些時(shí)候是沒(méi)問(wèn)題的,但是有的時(shí)候我們需要某些數(shù)據(jù)可以持久化的保存,這樣就需要做對(duì)應(yīng)的處理
    2023-01-01
  • springboot+vue實(shí)現(xiàn)文件上傳下載

    springboot+vue實(shí)現(xiàn)文件上傳下載

    這篇文章主要為大家詳細(xì)介紹了springboot+vue實(shí)現(xiàn)文件上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Vue3中按需引入ECharts詳細(xì)步驟(一看就會(huì))

    Vue3中按需引入ECharts詳細(xì)步驟(一看就會(huì))

    新項(xiàng)目采用Vue3作為前端項(xiàng)目框架,避免不了要使用echarts,這篇文章主要給大家介紹了關(guān)于Vue3中按需引入ECharts的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • VSCode插件安裝完成后的配置(常用配置)

    VSCode插件安裝完成后的配置(常用配置)

    這篇文章主要介紹了VSCode插件安裝完成后的配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • vue實(shí)現(xiàn)頁(yè)面上傳文件夾壓縮后傳給服務(wù)器的操作

    vue實(shí)現(xiàn)頁(yè)面上傳文件夾壓縮后傳給服務(wù)器的操作

    這篇文章主要介紹了vue實(shí)現(xiàn)頁(yè)面上傳文件夾壓縮后傳給服務(wù)器的操作,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • vue select選擇框數(shù)據(jù)變化監(jiān)聽(tīng)方法

    vue select選擇框數(shù)據(jù)變化監(jiān)聽(tīng)方法

    今天小編就為大家分享一篇vue select選擇框數(shù)據(jù)變化監(jiān)聽(tīng)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Vue綁定對(duì)象與數(shù)組變量更改后無(wú)法渲染問(wèn)題解決

    Vue綁定對(duì)象與數(shù)組變量更改后無(wú)法渲染問(wèn)題解決

    這篇文章主要介紹了Vue綁定對(duì)象與數(shù)組變量更改后無(wú)法渲染問(wèn)題解決,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Vue指令詳解之v-if與v-show的對(duì)比與常見(jiàn)應(yīng)用分析

    Vue指令詳解之v-if與v-show的對(duì)比與常見(jiàn)應(yīng)用分析

    Vue提供了v-if和v-show兩個(gè)指令來(lái)實(shí)現(xiàn)條件渲染,雖然它們都能控制元素的顯示與隱藏,但在實(shí)現(xiàn)機(jī)制和使用場(chǎng)景上有著顯著差異,本文將深入探討這兩個(gè)指令的工作原理、性能特點(diǎn)以及適用場(chǎng)景,幫助開(kāi)發(fā)者在實(shí)際項(xiàng)目中做出合理選擇,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 關(guān)于在vue2中使用weixin-js-sdk的詳細(xì)步驟

    關(guān)于在vue2中使用weixin-js-sdk的詳細(xì)步驟

    公司最近有微信公眾號(hào)的需求,那么微信登錄授權(quán)和如何使用WX-JSSDk實(shí)現(xiàn)分享等等肯定是最頭疼的問(wèn)題,這篇文章主要給大家介紹了關(guān)于在vue2中使用weixin-js-sdk的詳細(xì)步驟,需要的朋友可以參考下
    2024-07-07
  • 詳解VS Code使用之Vue工程配置format代碼格式化

    詳解VS Code使用之Vue工程配置format代碼格式化

    這篇文章主要介紹了詳解VS Code使用之Vue工程配置format代碼格式化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

连云港市| 遂溪县| 海原县| 体育| 兴文县| 全州县| 疏勒县| 焦作市| 新化县| 老河口市| 个旧市| 南宫市| 榆林市| 林芝县| 喀什市| 渝北区| 内江市| 遂川县| 清苑县| 秦安县| 施甸县| 新龙县| 修水县| 邢台市| 济宁市| 台安县| 威远县| 新和县| 邹城市| 安泽县| 建始县| 汉阴县| 东乌珠穆沁旗| 乐东| 苏尼特右旗| 霞浦县| 定边县| 龙胜| 巢湖市| 西安市| 中阳县|