电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

vue組件中節(jié)流函數(shù)的失效的原因和解決方法

瀏覽:197日期:2022-10-22 10:58:33

今天使用節(jié)流函數(shù)的時候遇見了一個問題,搞了半天才找到原因,所以在這里做個總結(jié)。

節(jié)流函數(shù)

瀏覽器的一些事件,如:resize,scroll,mousemove等。這些事件觸發(fā)頻率太過頻繁,綁定在這些事件上的回調(diào)函數(shù)會不停的被調(diào)用,加重瀏覽器的負(fù)擔(dān),導(dǎo)致用戶體驗(yàn)非常糟糕。所以先賢們發(fā)明了節(jié)流函數(shù),簡單版本如下:

function throttle (f, wait = 200) { let last = 0 return function (...args) { let now = Date.now() if (now - last > wait) { last = now f.apply(this, args) } }}

假設(shè)有一個 vue 組件 svgMark。這個組件中渲染的元素要在頁面窗口大小發(fā)生變化時重繪 reDraw ,而重繪時要使用節(jié)流函數(shù)防止性能損耗。正常情況下代碼如下:

<template> <div>{{ index }}</div></template><script>import { throttle } from ’lodash’export default { name: ’SvgMark’, data() { return { index: 0 } }, mounted() { window.addEventListener(’resize’, this.reDraw) }, beforeDestroy() { window.removeEventListener(’resize’, this.reDraw) }, methods: { reDraw: throttle(function() { this.index++ }, 500) }}</script></script>

一般情況下這樣用沒什么問題。但是有這樣一個場景,使用節(jié)流函數(shù)時卻失效了,即當(dāng)這個組件被 v-for 循環(huán)加載了很多次:

<template> <div> <svgMark v-for='item in 10' :key='item.id' /> </div></template>

這個時候無論渲染了多少個 svgMark 組件,在窗口大小改變的時候卻只觸發(fā)了第一個組件和第 n 割組件的重繪,為什么其他組件沒有觸發(fā)呢?這就要從頭說起了。

節(jié)流函數(shù)

節(jié)流函數(shù)在初始化的時候產(chǎn)生了一個閉包,閉包內(nèi)保存了變量 last ,這個 last 記錄了上一次執(zhí)行 f 函數(shù)的時間。而當(dāng)下一次觸發(fā)節(jié)流函數(shù)的時候,如果此時時間 now 減去上次時間 last 小于了我們規(guī)定的節(jié)流時間 wait ,那么函數(shù) f 將不會執(zhí)行。

很顯然,第一個子組件在觸發(fā)節(jié)流函數(shù)的時候產(chǎn)生了一個 last,而第二個組件在觸發(fā)節(jié)流函數(shù)時候的時產(chǎn)生的 now 并沒有滿足 now - last > wait 的條件,所以沒有執(zhí)行重繪代碼。而到了第 n 個組件觸發(fā)節(jié)流函數(shù)的時候,滿足了 now - last > wait 的條件所以重繪成功了。

vue 組件

vue 組件在代碼編譯的階段,組件 svgMark 中的方法 reDraw: throttle(function() { this.index++ }, 500) 就已經(jīng)被編譯成了類似如下函數(shù):

reDraw: ƒ (...args) { let now = Date.now() if (now - last > wait) { last = now f.apply(this, args) }}

由于函數(shù)是引用類型,所有使用子組件 svgMark 的 methods 中的 reDraw 都指向了同一個內(nèi)存地址,也就是說所有子組件的 reDraw 方法都是同一個函數(shù)。

因?yàn)樗薪M件都公用了同一個節(jié)流函數(shù),當(dāng)然就會產(chǎn)生節(jié)流了。那怎么解決問題呢?對癥下藥就要讓每個組件產(chǎn)生自己的節(jié)流函數(shù),而不產(chǎn)生共用。代碼如下

子組件:

<template> <div>{{ index }}</div></template><script>import { throttle } from ’lodash’export default { name: ’SvgMark’, data() { return { index: 0 } }, mounted() { this.reDraw = throttle(() => { this.index++ }, 500) window.addEventListener(’resize’, this.reDraw) }, beforeDestroy() { window.removeEventListener(’resize’, this.reDraw) }}</script>

我們在 mounted 聲明周期函數(shù)中手動聲明了 reDraw 函數(shù)替代 methods 中的 reDraw ,這樣在每個組件初始化的時候都會產(chǎn)生一個自己的節(jié)流函數(shù)了。需要注意此時節(jié)流函數(shù)的參數(shù)使用了箭頭函數(shù),因?yàn)檫@樣 this 才會指向組件實(shí)例。

以上就是節(jié)流函數(shù)帶給我的坑,現(xiàn)在分享給大家。[下班][鼓掌]

以上就是vue組件中節(jié)流函數(shù)的失效和解決方法的詳細(xì)內(nèi)容,更多關(guān)于vue 組件節(jié)流函數(shù)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 泥沙分离_泥沙分离设备_泥砂分离机_洛阳隆中重工机械有限公司 | 炒货机-炒菜机-炒酱机-炒米机@霍氏机械 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 电子海图系统-电梯检验系统-智慧供热系统开发-商品房预售资金监管系统 | 加盟店-品牌招商加盟-创业项目商机平台| 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 软膜天花_软膜灯箱_首选乐创品牌_一站式天花软膜材料供应商! | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 |