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

關(guān)于js中removeEventListener取消事件監(jiān)聽的坑

 更新時(shí)間:2022年09月01日 14:27:21   作者:huangfengnt  
許多入前端不久的人都會(huì)遇到removeEventListener無法清除監(jiān)聽的情況,下面這篇文章主要給大家介紹了關(guān)于js中removeEventListener取消事件監(jiān)聽的坑,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

從addEventListener說起,上代碼

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就沒有參數(shù)了
})

非要讓doSth有參數(shù),可以在函數(shù)外面包上一層函數(shù)

let doSth1=()=>{
    doSth(param)
}
onMounted(() => {
    window.addEventListener("click", doSth1)//這個(gè)doSth1就是外面包裝的函數(shù)
})

以上的原理都適用于removeEventListener,但是emoveEventListener還有一個(gè)注意點(diǎn),見下

onMounted(() => {
    window.addEventListener("click", () => {
        doSth()
    })
})
onUnmounted(() => {
    window.removeEventListener("click", () => {
        doSth()
    })
})

以上這樣的代碼是通不過的,因?yàn)閞emoveEventListener的第二個(gè)參數(shù),也就是那個(gè)回調(diào)函數(shù)必須和addEventListener的回調(diào)函數(shù)是同一個(gè)函數(shù),共享內(nèi)存,下面這種寫法就行得通

onMounted(() => {
    window.addEventListener("click", doSth)
})
onUnmounted(() => {
    window.removeEventListener("click",doSth)
})

然而,上面這種寫法還是不能傳參,所以要傳參的話還是要外包一個(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("沒傳參");
    }
 
}
onMounted(() => {
    window.addEventListener("click", doSth)
})
onUnmounted(() => {
    window.removeEventListener("click", doSth)
})

這樣的情況則會(huì)提示一則消息:

沒有與此調(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)行是可以的,沒什么問題,但是報(bào)錯(cuò)很難看,解決這個(gè)問題又不想在外面包上一層函數(shù),那么可以直接給doSth加上any類型

let doSth: any = (str: string) => {
    if (typeof str == "string") {
        console.log("傳參了");
    } else {
        console.log("沒傳參");
    }
 
}
onMounted(() => {
    window.addEventListener("click", doSth)
})
onUnmounted(() => {
    window.removeEventListener("click", doSth)
})

 當(dāng)然其中原因還是沒能搞懂,唉,慢慢來吧

總結(jié)

到此這篇關(guān)于js中removeEventListener取消事件監(jiān)聽的文章就介紹到這了,更多相關(guān)removeEventListener取消事件監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

金平| 灵丘县| 三江| 松溪县| 双辽市| 玉山县| 湖口县| 克东县| 永宁县| 永平县| 曲松县| 如皋市| 沽源县| 辽阳县| 奉化市| 赞皇县| 静海县| 黎城县| 丰顺县| 惠来县| 郎溪县| 鞍山市| 宿松县| 泽州县| 双峰县| 洛扎县| 庆城县| 周宁县| 平阳县| 柳林县| 达日县| 富阳市| 屯留县| 伊川县| 赣榆县| 五家渠市| 田林县| 嵊泗县| 容城县| 高雄市| 丁青县|