添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱喝酒的刺猬  ·  Bindable events and ...·  2 周前    · 
慷慨的黄豆  ·  Solved: HubSpot ...·  1 周前    · 
烦恼的手术刀  ·  浮窗WindowManager ...·  1 周前    · 
睿智的香菇  ·  Event Handling | Vue ...·  1 周前    · 
酒量小的水煮鱼  ·  Need Help On Complete ...·  1 月前    · 
追风的打火机  ·  remarkable 2 ...·  2 月前    · 

addEventListener有一个箭头函数回调函数,这个函数本身不能传参(当然event除外),如果你要传参,只能在doSth函数上传,我们也可以将箭头函数回调函数替换成一个函数,但是这个函数明显不能有参数

onMounted(() => {
    window.addEventListener("click", doSth)//这个doSth就没有参数了

非要让doSth有参数,可以在函数外面包上一层函数

let doSth1=()=>{
    doSth(param)
onMounted(() => {
    window.addEventListener("click", doSth1)//这个doSth1就是外面包装的函数

以上的原理都适用于removeEventListener,但是emoveEventListener还有一个注意点,见下

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

以上这样的代码是通不过的,因为removeEventListener的第二个参数,也就是那个回调函数必须和addEventListener的回调函数是同一个函数,共享内存,下面这种写法就行得通

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

然而,上面这种写法还是不能传参,所以要传参的话还是要外包一个函数,如下

let doSth = (str: string) => {
    console.log(str);
let doSth1 = () => {
    doSth("haha")
onMounted(() => {
    window.addEventListener("click", doSth1)
onUnmounted(() => {
    window.removeEventListener("click", doSth1)

然而,如果你用ts的话,doSth函数的参数可以是一个可选参数,如下

let doSth = (str?: string) => {
    if (typeof str == "string") {
        console.log("传参了");
    } else {
        console.log("没传参");
onMounted(() => {
    window.addEventListener("click", doSth)
onUnmounted(() => {
    window.removeEventListener("click", doSth)

这样的情况则会提示一则消息:

没有与此调用匹配的重载。
  第 1 个重载(共 2 个),“(type: "click", listener: (this: Window, ev: MouseEvent) => any, options?: boolean | AddEventListenerOptions | undefined): void”,出现以下错误。
  第 2 个重载(共 2 个),“(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void”,出现以下错误。

当然这样实际运行是可以的,没什么问题,但是报错很难看,解决这个问题又不想在外面包上一层函数,那么可以直接给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)

 当然其中原因还是没能搞懂,唉,慢慢来吧

1. 原因 许多入前端不久的人都会遇到 removeEventListener 无法清除监听的情况,这是由于 要移除事件句柄,addEventListener() 的执行函数必须使用外部函数,如上实例所示 (myFunction)。 匿名函数,类似 “document.removeEventListener(“event”, function(){ myScript });” 该事件是无法移除的。 而在很多情况下我们需要句柄回调的传参,又需要其他传参时免不了使用句柄,这个时候我们需要写一个方法去替代这个回调,以下是解决方式,写了一个addListener 函数在 addEventListene 1.监听事件addEventListener() 语法2.取消事件removeEventListener() 语法参数说明type: 表示监听事件类型的字符串。listener: 目标事件绑定的回调函数options: 一个指定有关 listener 属性的可选参数对象useCapture: 指定需要移除的 EventListener 函数是否为捕获监听器。true 表示“事件捕获”, 默认为false, 表示“事件冒泡”3. removeEventListener() 移除成功需要满足。 可能你也碰到过这种情况,就是在js的代码中用了[removed]后,可能会影响到body中的onload事件。你可以全写在body中,也可以全放到[removed]中,但是这样并不是很方便,有时我们需要两个同时用到。这时就要用window.attachEvent和window.addEventListener来解决一下。 下面是一个解决方法。至于attachEvent和addEventListener的用法,可以自己Google或百度一下。 代码如下: if (document.all){ window.attachEvent(‘onload’,函数名)//IE中 } els vue项目中的小记录下,想要移除window的addEventListener,需要把后面的function挂在到this上,removeEventListener 和 addEventListener 中对应的参数要一致。 beforeDestroy() { //在组件生命周期结束的时候销毁。 window.removeEventListener('scroll',... 描述:addEventListener()方法用于向指定元素添加事件 语法:元素节点.addEventListener('type',ListenFunc,useCapture); (1)第一个参数表示绑定事件的类型,【没有on!是个字符串】 (2)第二个参数表示监听函数,就是事件发生的时候执行的哪个函数(使用函数名,来引用外部函数) (3)第三个参数是否采用捕获机制,默认不写和false都代表冒泡机... 上面我们在自定义指令的时候在mounted中对dom添加事件监听,在beforeUnmount中进行事件解绑,但是第二个参数是匿名函数,所以add和remove的函数不是同一个所以参数不一致,remove是无效的。一般在组件中使用addeventlistener添加事件监听的时候,在组件销毁的时候都要使用removeEventListener进行销毁,不然会造成内存泄漏。上面这样写确实可以消除掉绑定的事件,但是无法进行参数的传递无法再函数中使用el,biinding等参数。 捕获型事件流: 事件的传播是从最不特定的事件目标到最特定的事件目标。即从DOM树的根到叶子。 DOM标准采用捕获+冒泡。两种事件流都会触发DOM的所有对象,从document对象开始,也在document对象结束。 来个例子看一下吧! <!DOCTYPE h...