当前位置: 首页 > 原理解释

vue自定义事件的原理-vue 自定义事件原理解析

我常认定 Vue 的自定义事件就是给 DOM 和 JS 之间搭了一条松散的桥,而不是焊死的一条铁轨。大量人一开口就急着讲 origin,讲 set,讲 emit,但在实际写逻辑要么调试的时候,我认定这些概念忒像书本上的定义,倒不如把它们当成两个互相聊天的哥们儿。
你看那套接口文档,把 data 当作了输入,把 methods 当作了输出,这种用法实际上挺像极了我们平时习惯的函数调用,只不过 Vue 把它封装得略微有点绕。 就说 `emit` 这个函数吧,它本质上就是一个回调函数。在 Vue 3 里,你不需求去定义本地变量,直接写 `v-on:click="handleClick"`,这里面的 `handleClick` 实际上就是一个一般/平平的参数列表。
你想想,要是 Vue 不如此做,你每次都要去写一个状态变量来存数据,那岂不是要写一堆 `data` ?直接传参,就像是在浏览器里直接传一个字符串,“把这件事告诉对方”,对方收到后就能够自己拍板如何处理。别看听起来好办,但在 Vue 2 的时候,它不一样,那时候它是在监听器里绑定了,直接调用回去。目前它变成了一个纯函数,调用方全权负责,被调用方负责自己做拍板。 这时候就会有人问,那 `origin` 呢?大量人一看就懵,感觉像是在搞啥数据库里的连接 ID。
这就得换个说法,想象你在森林里砍树,树有主根和分支,`origin` 就像是树的根,你是通过这根主根来告诉世界这个树被砍了。在 Vue 里,这个主根就是 `Vue` 实例,要么更具体一点,就是一个 DOM 元素。当你在模板里写 `v-on:click="handleClick"`,这个 `handleClick` 就是那个被砍的树枝,而 `this` 对应的 DOM 就是那棵大树。当兄弟元素点击了它,`this` 会立马变成那个 DOM 对象,然后 `handleClick` 里的代码就能拿到这个 DOM 对象了。你没认定这跟操作本地变量有啥大区别吗?这实际上就是 Vue 为了让你和 DOM 更亲近,特意设计的一套机制。 再说说 `on` 和 `off` 这两个方式,大量人当作它们就是两个开关,开和关,用一用就没了。
实际上不然,它们更像是在给这棵树做标记。`on` 就像是你在树上刻下一个印章,写上 `on:node.click`,赶明儿哪位想砍这棵树,只要看到那个印章就能知道你要干啥,并且那个标记是你自己刻的,别人看不懂,你也不用揪心别人给这棵树动了手脚。而 `off` 呢,就像是把这棵树上的印章撕掉,要么找个地方重新刻一个。
要是你用了 `on`,后来发现这棵树突然想被砍,要么你换个位置,你就用 `off` 把它给废了,要么用 `on` 盖个新章。
这就避免了你在几千行代码里反复去绑同一个监听器,`off` 之后还要去删掉,不然代码会乱得像鸡窝。 说到数据传递,这局部的逻辑实际上挺有趣的。我们之前聊过 `this`,目前有个 `data`,它们是如何配合的?我认定能够把数据想象成一个信封,`data` 是信封里的信,`this` 是信封的外壳。当你在模板里写 `data={count: 0}`,你实际上是在数据属性上写了一个数字。你会发现,这里面的 `count` 和外面绑定的 `count` 是彻底一样的。
这就是为啥 `data` 能如此好用,出于它直接就在 `this` 对象里,不需求你额外去定义一个变量。当你调用 `emit("click")` 时,你只是把这个数字从数据属性上移到了外部,`emit` 函数接收到后,它拿到这个数字,然后你能够把它存到 `this.count` 里,要么传给别的方式。 我见过不少开发者在 `nextTick` 里写事件,认定那是强制刷新,但实际上那更像是在等一个特别的时刻。
有时候你想在 DOM 彻底渲染完之后再触发事件,这时候 `nextTick` 就像是你站在舞台中央,等灯光打稳了再喊一声。自然,用 `nextTick` 去触发事件也不是啥好方式,出于它是为了让事件在下一个 tick 里执行,这可能会害得事件处理逻辑影响到了还没渲染完的 DOM,比如弹窗没出来就点关闭按钮,这就像是在还没搭建好房子的地基上盖房,好办塌下来。更稳妥的做法,还是直接在模板里写 `@click`,然后确保你的逻辑是在 DOM 节点上绑定的。 有时候我们还会遇到一个难题,就是全局变量和组件数据混在一起了,这实际上挺费事的。
这时候 `emit` 就显得特别关键了,它就像是一个 NPC 的传令兵,专门负责把数据从 A 处传送到 B 处。
要是 A 处的数据是 `this.count`,B 处可能只需求拿到 `count` 这个数字,要么 `this.count` 加上一个字符串。`emit` 能够把这串消息发出去,接收方拿到消息后,根据消息类型拍板下一步该干嘛。
这种解耦的方式,比硬编码的变量要灵活多了。 最终咱还是聊聊那个 `data` 属性。大量人当作 `data` 就是存数据的容器,实际上它更像是一个入口。当你写 `data={count: 0}` 时,这个 `count` 实际上是一个默认值。
要是不想给默认值,你能够写了不写,就像你给一个函数传了参数又传了不传,函数里直接 undefined 要么默认值一样。当你把数据从 `data` 移到外面,去 `emit` 去传的时候,`data` 里就空了,要么有其他数据了。
这就像是一个仓库,大量东西装进去了,但极少拿出来,要么拿出来之前你不想让别人看到。 总的来说,自定义事件在 Vue 里,不是那种复杂的数据库逻辑,而更像是一种灵活的通信协议。它让两个要么多个局部能够互相“讲话”,并且这种讲话的方式是松散的,不强制绑定,也不像传统的事件那样一绑就是一辈子的。通过 `emit` 和 `on`,再加上 `this` 的自动绑定,Vue 构建了一个简洁而强大的沟通网络。别看看着代码有点绕,但一旦用起来,你会发现它确实挺符合直觉的,比那些看着像堆砌代码、用起来却让人头疼的东西强多了。就像我们日常聊天,不用写复杂的报告,直接讲话就行,别看听起来好办,但效果往往还不错。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站