预防家暴,☠️ 慎用 $listeners

2,998 阅读2分钟

关键词:Vue $listeners $attrs bug 透传

2021 年 5 月 31 日,没错,就是在 六一儿童节 的前一天。一宗 错综复杂惊天地泣鬼神惨绝人寰家暴 未成年人的惨案,悄悄地发生了!

欢迎来到 《JSChen 的新闻联播间》! 用诙谐的方式记录工作中遇到的一些灵异事件,大家好,我是技术小侦探 JSChen

话接上文,这惨案的背后到底发生了什么呢?

下面,就让身为 正义天使JSChen(我) 来带领大家,逐步地揭开整宗案件的神秘面纱!☠️

案件的起因

世间之大,无奇不有,总有一些调皮捣蛋、却又活泼开朗的祖国花朵(可爱的小孩儿)干一些童年的田间趣事(勾当)。

今天天气晴朗,清风徐徐,主人公 小明 打开家门,走了出来,看到蓝色的天空中白云一朵朵像极了棉花☁️ 。然后他就......

WechatIMG377.png

人物关系了解

qyo8u.csb.app_ (3).png

案件的经过

温馨提示:源代码在最后的附录

components/XiaoMing.vue(小明)

// 小明
<template>
  <div class="person" @click="上房揭瓦()">
    <div class="house">🏠</div>
    <div class="btn">👆 上房揭瓦</div>
    <div class="person">我是 👦 小明 👦</div>
  </div>
</template>

<script>
export default {
  name: "XiaoMing",
  methods: {
    上房揭瓦() {
      console.log("小明: 上房揭瓦");
      this.$emit("上房揭瓦");
    },
  },
};
</script>

小明 爬上了屋顶,并且开启了 自嗨 模式,同时告诉了自己的 爸爸

components/Papa.vue(小明爸爸)

<template>
  <div class="person">
    我是小明的 👨 爸爸 👨
    <XiaoMing 
      @上房揭瓦="上房揭瓦()" 
      v-on="$listeners">
    </XiaoMing>
  </div>
</template>

<script>
import XiaoMing from "./XiaoMing";

export default {
  name: "Papa",
  components: {
    XiaoMing,
  },
  methods: {
    上房揭瓦() {
      this.$emit("上房揭瓦");
    },
  },
};
</script>

小明爸爸,是一个 和蔼可亲 又 憨态可掬(像 JSChen 的同事 小烽 一样)的 大憨憨,理解孩子的天真烂漫,不忍过多苛责,所以,小明爸爸小明 上房揭瓦的事情告诉了 小明爷爷

彩蛋:小明爷爷 平常很关心 小明 的一举一动($listeners)

components/Grandpa.vue(小明爷爷)

<template>
  <div class="person">
    我是小明的爷爷👴
    <Papa @上房揭瓦="上房揭瓦()"></Papa>
  </div>
</template>

<script>
import Papa from "./Papa";

export default {
  name: "Grandpa",
  components: {
    Papa,
  },
  methods: {
    上房揭瓦() {
      console.log("爷爷: 暴打小学生");
    },
  },
};
</script>

这天,小明爷爷 悠闲的坐在摇摇椅上哼着小曲儿,看着自家屋顶!

本来是美好的一天,可惜世事难料啊,突然之间:

  • 小明爷爷 听到 小明爸爸 的呼唤
  • 小明爷爷 看到 小明 在楼顶 🎉嗨皮🎉

WechatIMG10.jpeg

案件的结果

不出所料,苦命的 小明 在此次家暴事件中就 上房揭瓦 了一次,却被 小明爷爷 暴打了 2 顿!

codesandbox.io_s_damp-worker-qyo8u_file=_src_components_Grandpa.vue.png

案件的总结

☠️ 慎用 listeners,且行且珍惜。

这惨案的背后其实就是小明一家对 listener 的使用不当导致的,我们可以看下 Vue.js 官方文档的例子和描述

vue -- 将原生事件绑定到组件

总结两点:

  1. 在没有拉齐认知的情况下,建议业务组件禁止使用。

  2. 如果情况特殊,必须要使用 listener,以小明一家为例,小明爸爸挂在小明身上 listenner其他的事件监听 需要做一次去重工作!

故事的最后,在我们工作人员的开导与教育下,小明爸爸觉得家事还是比较业务的,所以解除了 listener ,并且下定决心,以后对小明的教育要自己亲力亲为!

好的,今天的新闻到此结束,感谢各位的观看,下一期节目再见!🎉

附录

vue -- 将原生事件绑定到组件

源代码 -- 小明家暴案件