關(guān)于js中removeEventListener取消事件監(jiān)聽(tīng)的坑
從addEventListener說(shuō)起,上代碼
onMounted(() => {
window.addEventListener("click", ()=>{
doSth(param)//param為參數(shù)
})
})addEventListener有一個(gè)箭頭函數(shù)回調(diào)函數(shù),這個(gè)函數(shù)本身不能傳參(當(dāng)然event除外),如果你要傳參,只能在doSth函數(shù)上傳,我們也可以將箭頭函數(shù)回調(diào)函數(shù)替換成一個(gè)函數(shù),但是這個(gè)函數(shù)明顯不能有參數(shù)
onMounted(() => {
window.addEventListener("click", doSth)//這個(gè)doSth就沒(méi)有參數(shù)了
})非要讓doSth有參數(shù),可以在函數(shù)外面包上一層函數(shù)
let doSth1=()=>{
doSth(param)
}
onMounted(() => {
window.addEventListener("click", doSth1)//這個(gè)doSth1就是外面包裝的函數(shù)
})以上的原理都適用于removeEventListener,但是emoveEventListener還有一個(gè)注意點(diǎn),見(jiàn)下
onMounted(() => {
window.addEventListener("click", () => {
doSth()
})
})
onUnmounted(() => {
window.removeEventListener("click", () => {
doSth()
})
})以上這樣的代碼是通不過(guò)的,因?yàn)閞emoveEventListener的第二個(gè)參數(shù),也就是那個(gè)回調(diào)函數(shù)必須和addEventListener的回調(diào)函數(shù)是同一個(gè)函數(shù),共享內(nèi)存,下面這種寫(xiě)法就行得通
onMounted(() => {
window.addEventListener("click", doSth)
})
onUnmounted(() => {
window.removeEventListener("click",doSth)
})然而,上面這種寫(xiě)法還是不能傳參,所以要傳參的話還是要外包一個(gè)函數(shù),如下
let doSth = (str: string) => {
console.log(str);
}
let doSth1 = () => {
doSth("haha")
}
onMounted(() => {
window.addEventListener("click", doSth1)
})
onUnmounted(() => {
window.removeEventListener("click", doSth1)
})然而,如果你用ts的話,doSth函數(shù)的參數(shù)可以是一個(gè)可選參數(shù),如下
let doSth = (str?: string) => {
if (typeof str == "string") {
console.log("傳參了");
} else {
console.log("沒(méi)傳參");
}
}
onMounted(() => {
window.addEventListener("click", doSth)
})
onUnmounted(() => {
window.removeEventListener("click", doSth)
})這樣的情況則會(huì)提示一則消息:
沒(méi)有與此調(diào)用匹配的重載。
第 1 個(gè)重載(共 2 個(gè)),“(type: "click", listener: (this: Window, ev: MouseEvent) => any, options?: boolean | AddEventListenerOptions | undefined): void”,出現(xiàn)以下錯(cuò)誤。
第 2 個(gè)重載(共 2 個(gè)),“(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void”,出現(xiàn)以下錯(cuò)誤。
當(dāng)然這樣實(shí)際運(yùn)行是可以的,沒(méi)什么問(wèn)題,但是報(bào)錯(cuò)很難看,解決這個(gè)問(wèn)題又不想在外面包上一層函數(shù),那么可以直接給doSth加上any類型
let doSth: any = (str: string) => {
if (typeof str == "string") {
console.log("傳參了");
} else {
console.log("沒(méi)傳參");
}
}
onMounted(() => {
window.addEventListener("click", doSth)
})
onUnmounted(() => {
window.removeEventListener("click", doSth)
})當(dāng)然其中原因還是沒(méi)能搞懂,唉,慢慢來(lái)吧
總結(jié)
到此這篇關(guān)于js中removeEventListener取消事件監(jiān)聽(tīng)的文章就介紹到這了,更多相關(guān)removeEventListener取消事件監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- javascript如何刪除所有事件監(jiān)聽(tīng)器
- JavaScript鼠標(biāo)拖動(dòng)事件監(jiān)聽(tīng)使用方法以及實(shí)例效果演示
- vue.js綁定事件監(jiān)聽(tīng)器示例【基于v-on事件綁定】
- vue.js過(guò)濾器+ajax實(shí)現(xiàn)事件監(jiān)聽(tīng)及后臺(tái)php數(shù)據(jù)交互實(shí)例
- vuejs2.0實(shí)現(xiàn)分頁(yè)組件使用$emit進(jìn)行事件監(jiān)聽(tīng)數(shù)據(jù)傳遞的方法
- javascript 組合按鍵事件監(jiān)聽(tīng)實(shí)現(xiàn)代碼
- 一文詳解JavaScript的事件監(jiān)聽(tīng)(最新整理)
相關(guān)文章
經(jīng)典面試題之JavaScript?for循環(huán)(var?let)
如果你也在面試找工作,那么也一定遇到過(guò)這道for循環(huán)打印結(jié)果的題,下面我們來(lái)探討下,對(duì)經(jīng)典面試題之js?for循環(huán)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2023-10-10
scroll事件實(shí)現(xiàn)監(jiān)控滾動(dòng)條并分頁(yè)顯示(zepto.js)
這篇文章主要為大家詳細(xì)介紹了scroll事件實(shí)現(xiàn)監(jiān)控滾動(dòng)條并分頁(yè)顯示示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
js prototype 格式化數(shù)字 By shawl.qiu
js prototype 格式化數(shù)字 By shawl.qiu...2007-04-04
javascript獲取本機(jī)操作系統(tǒng)類型的方法
關(guān)于我們使用電腦的操作系統(tǒng),我們通過(guò)鼠標(biāo)點(diǎn)擊就能獲取,如果我們想用腳本怎么實(shí)現(xiàn)javascript獲取本機(jī)操作系統(tǒng)類型的方法呢,下面給大家分享javascript獲取本機(jī)操作系統(tǒng)類型的方法,需要的朋友可以參考下2015-08-08
js 輸入框 正則表達(dá)式(菜鳥(niǎo)必看教程)
下面小編就為大家?guī)?lái)一篇js輸入框使用正則表達(dá)式校驗(yàn)輸入內(nèi)容的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
el-select加上搜索查詢時(shí)限制開(kāi)頭空格輸入的解決方案
這篇文章主要介紹了el-select加上搜索查詢時(shí),限制開(kāi)頭空格輸入的解決方案,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-02-02

