国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Vue框架TypeScript裝飾器使用指南小結

2024-05-06 15:42:19
字體:
來源:轉載
供稿:網友

前言

裝飾器是一種特殊類型的聲明,它能夠被附加到 類聲明,方法, 訪問符,屬性或參數 上。 裝飾器使用 @expression這種形式, expression求值 后必須為一個函數,它會在 運行時被調用 ,被裝飾的聲明信息做為參數傳入。

本篇先從項目的宏觀角度來總結一下Decorator如何組織。

目錄

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

主要的Decorator依賴

vue-cli3 默認支持Decorator, 年初重寫了一個design庫主要依賴官方和社區提供的Decorator來實現的組件。 Decorator可以非侵入的裝飾類、方法、屬性,解耦業務邏輯和輔助功能邏輯。以下是主要的三方Decorator組件:

vue-class-component

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

vuex-class

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

@State @Getter @Action @Mutation

vue-property-decorator

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

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

core-decorators

@readonly @autobind : TSX 回調函數中的 this,類的方法默認是不會綁定 this 的,可以使用autobind裝飾器 @override

總結一下主要就分成這三類:

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

以上引用方法等詳系內容可查看官方文檔。下面自定義部分來實現一個記錄日志功能的裝飾器。

自定義Decorator示例

@Logger,Logger日志裝飾器通常是修飾方法,Decorater則是在 運行時就被觸發了 ,日志記錄是在 方法被調用時觸發 ,示例中通過自動發布事件實現調用時觸發。為增加日志記錄的靈活性,需要通過暴露鉤子函數的方式來改變日志記錄的內容。
期望的日志格式

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

實現

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 => {    // 根據業務邏輯來處理日志    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(',')})`;        // 執行原方法        const value = oldValue.apply(this, arguments);        loggerInfo.output = value;        hander && (loggerInfo.custom = hander(loggerInfo.input, loggerInfo.output) || '');        // 被調用時,會自動發出一個事件        msgChannel.publish(logId, loggerInfo);      }      return descriptor  }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 黑水县| 建水县| 招远市| 黔南| 台东市| 永清县| 靖西县| 台东县| 固安县| 桦南县| 丰宁| 合山市| 鲁山县| 高安市| 桐城市| 措美县| 新民市| 保靖县| 都江堰市| 东莞市| 诸城市| 景洪市| 佛山市| 福泉市| 桦南县| 怀宁县| 泸定县| 广元市| 韶关市| 西乌珠穆沁旗| 廉江市| 四会市| 故城县| 新邵县| 濉溪县| 华容县| 阳山县| 永修县| 西昌市| 利辛县| 浦江县|