日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

分享能提高開發效率,提高代碼質量的八個前端裝飾器函數

來源: 責編: 時間:2024-05-21 17:32:39 150觀看
導讀裝飾器非常好用前面給大家發了一篇文章xxx,給大家介紹了一遍JavaScript中的裝飾器,今天就給大家介紹一下在我項目中用到過的幾個裝飾器的思路吧!代碼是偽代碼,只是提供個思路,實際上代碼不止這么少。防抖裝飾器當我們在一

裝飾器非常好用

前面給大家發了一篇文章xxx,給大家介紹了一遍JavaScript中的裝飾器,今天就給大家介紹一下在我項目中用到過的幾個裝飾器的思路吧!hUN28資訊網——每日最新資訊28at.com

代碼是偽代碼,只是提供個思路,實際上代碼不止這么少。hUN28資訊網——每日最新資訊28at.com

防抖裝飾器

當我們在一些特殊場景時,需要使用防抖這個優化手段來進行優化,比如:hUN28資訊網——每日最新資訊28at.com

  • 表單提交
  • 數據的搜索
  • 數據的篩選
  • 某些數據的更改
  • 數據改變時觸發的回調

這些函數都可以使用防抖裝飾器來進行性能優化,防抖的意思是,當你頻繁執行某一個操作時,這個操作只執行最后一次,確保不會因為頻繁的執行而損耗性能~下面是裝飾器的封裝:hUN28資訊網——每日最新資訊28at.com

// 裝飾器的封裝function debounce(delay) {  return function(target, key, descriptor) {    const originalMethod = descriptor.value;    let timer;    descriptor.value = function(...args) {      clearTimeout(timer);      timer = setTimeout(() => {        originalMethod.apply(this, args);      }, delay);    };    return descriptor;  };}

當我們某個函數需要進行防抖處理時:hUN28資訊網——每日最新資訊28at.com

@debounce(500)submit() {}@debounce(500)handleChange() {}@debounce(500)handleFilter() {}

節流裝飾器

節流跟防抖是不同的優化手段,節流是保證在一段時間內只執行一次操作,適用在這些場景中:hUN28資訊網——每日最新資訊28at.com

  • 監聽窗口寬度變化的回調
  • 監聽滾動條變化的回調

下面是裝飾器的封裝:hUN28資訊網——每日最新資訊28at.com

function throttle(delay) {  return function(target, key, descriptor) {    const originalMethod = descriptor.value;    let timer;    let lastExecTime = 0;    descriptor.value = function(...args) {      const now = Date.now();      if (now - lastExecTime >= delay) {        lastExecTime = now;        originalMethod.apply(this, args);      } else {        clearTimeout(timer);        timer = setTimeout(() => {          originalMethod.apply(this, args);        }, delay);      }    };    return descriptor;  };}

當我們某個函數需要進行節流處理時:hUN28資訊網——每日最新資訊28at.com

@throttle(200)handleScroll() {}@throttle(200)handleResize() {}

日志輸出裝飾器

日志的輸出是很重要的,尤其是在 Nodejs 端,日志輸出會通過 pm2 等工具,記錄在一些日志文件里,尤其是一些比較公用的工具函數,更是非常重要,一般需要記錄這些內容。hUN28資訊網——每日最新資訊28at.com

  • 執行的函數名稱
  • 執行時傳入的參數
  • 執行后獲取到的結果

下面是裝飾器的封裝:hUN28資訊網——每日最新資訊28at.com

function log(target, key, descriptor) {  const originalMethod = descriptor.value;  descriptor.value = function(...args) {    console.log(`Entering ${key} with arguments:`, args);    const result = originalMethod.apply(this, args);    console.log(`Exiting ${key} with result:`, result);    return result;  };  return descriptor;}

使用的時候:hUN28資訊網——每日最新資訊28at.com

class Common {    @log()    commonRequest(url, params) {        return request(url, params)    }}const common = new Common()common.commonRequest('http://xxx.com', { name: 'l' })Entering commonRequest with arguments: ['http://xxx.com', { name: 'l' }]Exiting commonRequest with result: { 結果 }

錯誤處理裝飾器

跟日志裝飾器一樣,錯誤其實也是日志的一部分,錯誤日志非常重要,因為 Nodejs 的線上報錯,大部分都需要通過查日志來進行定位,所以我們也可以封裝一個錯誤的處理裝飾器:hUN28資訊網——每日最新資訊28at.com

function errorHandler(target, key, descriptor) {  const originalMethod = descriptor.value;  descriptor.value = function (...args) {    try {      originalMethod.apply(this, args);    } catch (error) {      console.error(`Error occurred in ${key}:`, error);    }  };  return descriptor;}

使用的時候:hUN28資訊網——每日最新資訊28at.com

class Common {    @log()    commonRequest(url, params) {        return request(url, params)    }}const common = new Common()common.commonRequest('http://xxx.com', { name: 'l' })Error occurred in commonRequest: Request Error

權限校驗裝飾器

權限的校驗在前端一般都不用裝飾器,但是在 Nodejs 管理接口時,涉及到權限校驗時,用裝飾器是非常的方便的。hUN28資訊網——每日最新資訊28at.com

function authenticated(target, key, descriptor) {  const originalMethod = descriptor.value;  descriptor.value = function(...args) {    if (isAuthenticated()) {      originalMethod.apply(this, args);    } else {      console.log('Unauthorized access!');    }  };  return descriptor;}

使用的時候,這樣就只有 admin 的身份可以訪問這個接口了。hUN28資訊網——每日最新資訊28at.com

class User {      @Get('/xx/xx')    @authenticated('admin')    getUser() {}}

計時裝飾器

如果有一天,你們需要埋點,計算一些比較重要函數的運行性能時,那么你肯定需要計算這些函數的執行時間是多少,這時候封裝一個計時裝飾器會讓你非常方便。hUN28資訊網——每日最新資訊28at.com

function timing(target, key, descriptor) {  const originalMethod = descriptor.value;  descriptor.value = function(...args) {    const start = performance.now();    const result = originalMethod.apply(this, args);    const end = performance.now();    console.log(`Execution time of ${key}: ${end - start} milliseconds`);    return result;  };  return descriptor;}

使用時:hUN28資訊網——每日最新資訊28at.com

class Common {    @timing()    commonRequest(url, params) {        return request(url, params)    }}const common = new Common()common.commonRequest()Execution time of commonRequest: 20 milliseconds

緩存裝飾器

這個裝飾器適用在某一些場景,如果你有一個函數是用來計算值的,并且計算的過程非常復雜非常耗時間,那我建議你可以把這些計算結果儲存起來,而不是每次都重新計算,這能大大提升你的計算性能。hUN28資訊網——每日最新資訊28at.com

function cache(target, key, descriptor) {  const originalMethod = descriptor.value;  const cache = new Map();  descriptor.value = function(...args) {    const cacheKey = JSON.stringify(args);    if (cache.has(cacheKey)) {      return cache.get(cacheKey);    }    const result = originalMethod.apply(this, args);    cache.set(cacheKey, result);    return result;  };  return descriptor;}

使用時:hUN28資訊網——每日最新資訊28at.com

class Compute() {    @cache()    run(num1, num2) {        // 這里舉個簡單例子        return num1 + num2    }}const c = new Compute()c.run(1, 2) // 3 首次計算c.run(1, 2) // 3 接下來都從緩存中拿

參數校驗裝飾器

在老項目中,無法用到 typescript 這么好的東西時,對于一些函數執行時,有必要用裝飾器對傳進來的參數的類型進行校驗~沒辦法,沒有 typescript 真難受啊!hUN28資訊網——每日最新資訊28at.com

function validateArgs(...types) {  return function (target, key, descriptor) {    const originalMethod = descriptor.value;    descriptor.value = function (...args) {      for (let i = 0; i < types.length; i++) {        const type = types[i];        const arg = args[i];        if (typeof arg !== type) {          throw new Error(`Invalid argument type at index ${i}`);        }      }      originalMethod.apply(this, args);    };    return descriptor;  };}

使用的時候需要傳入某個參數的類型限制。hUN28資訊網——每日最新資訊28at.com

class Common {    @validateArgs(['string', 'object'])    commonRequest(url, params) {        return request(url, params)    }}const common = new Common()common.commonRequest(123, 123) // 報錯


hUN28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-89713-0.html分享能提高開發效率,提高代碼質量的八個前端裝飾器函數

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C# 線程池的使用方法

下一篇: 如何為 Nest.js 編寫單元測試和 E2E 測試

標簽:
  • 熱門焦點
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
  • iQOO Neo8系列或定檔5月23日:首發天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
Top 主站蜘蛛池模板: 溧阳市| 三门县| 西昌市| 井陉县| 阿图什市| 长沙市| 什邡市| 忻城县| 蓝山县| 广河县| 惠安县| 三明市| 松潘县| 肇东市| 郴州市| 丘北县| 枣庄市| 金平| 霸州市| 巩义市| 彩票| 灵川县| 星子县| 新野县| 义马市| 杂多县| 神木县| 宁城县| 长治市| 克山县| 江山市| 徐州市| 图片| 宁南县| 茌平县| 吴川市| 凉城县| 娄底市| 泰顺县| 太白县| 岐山县|