关于vue中$emit 触发两次自定义事件的问题

父组件代码
<template>
  <div>
    <!-- 原生DOM事件 -->
    <button @click="handle">点击</button>
    <!-- 原本是自定义事件,加上native修饰符转换成原生DOM事件,实际上是在Event1组件的根元素上加click事件 -->
    <Event1 @click.native="handle1"></Event1>
    <Event2 ref="event2" @getName="handle2" :getNum="getNum"></Event2>
  </div>
</template>
<script>
import Event1 from "./components/Event1";
import Event2 from "./components/Event2";
export default {
  name: "App",
  data() {
    return {};
  },
  methods: {
    handle() {
      console.log(123);
    },
    handle1() {
      console.log("Event1组件");
    },
    getNum(num) {
      console.log("收到子组件Event2传过来的数字:" + num);
    },
    //与自定义事件绑定
    handle2(name) {
      console.log("收到子组件Event2传过来的名字:" + name);
    },
  },
  components: {
    Event1,
    Event2,
  },
  // 组件挂载时
  mounted() {
    // 绑定自定义事件
    this.$refs.event2.$on("getName", this.handle2);
  },
};
</script>
子组件代码
<template>
  <div class="box">
    <button @click="sendName">点击发送名字</button>
    <button @click="sendNum">点击发送数字</button>
  </div>
</template>

<script>
export default {
  name: "Event2",
  data() {
    return {
      uname: "joke",
      num: "123456",
    };
  },
  props: ["getNum"],
  methods: {
    sendName() {
      this.$emit("getName", this.uname);
    },
    sendNum() {
      this.getNum(this.num);
    },
  },
};
</script>

输出情况:点击发送名字 控制台输出如下: 打印了两遍

 解决办法:1、直接在绑定事件的时候,直接在回调中写相应的执行语句,在上面子组件中就不用写 @getName="handle2",然后handle2方法也不用写了

mounted() {
    // 绑定自定义事件
    this.$refs.event2.$on("getName", function (name) {
      console.log("收到子组件Event2传过来的名字:" + name);
    });
  },

2、使用props直接将自定义事件传给子组件,子组件直接调用并传参,参考上面getNum方法

最后,之前想在原有代码上解决打印两遍问题,但没啥思路,网上也没搜到解决方法,有哪个高手知道答案的,评论区见!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,通过 `$emit` 方法触发定义事件之前,需要先在组件注册该自定义事件。 在 Vue 2 ,可以通过 `$on` 方法在组件注册自定义事件的处理函数。这样,在组件使用 `$emit` 方法触发该自定义事件时,对应的函数就会被调用。 例如,在父组件注册一个名为 `custom-event` 的自定义事件的处理函数: ```javascript // 父组件 <template> <div> <child-component @custom-event="handleCustomEvent"></child-component> </div> </template> <script> export default { methods: { handleCustomEvent(data) { // 处理自定义事件的逻辑 console.log(data); } } } </script> ``` 然后,在子组件通过 `$emit` 方法触发 `custom-event` 自定义事件,并传递数据给父组件: ```javascript // 子组件 <template> <div> <button @click="triggerCustomEvent">触发定义事件</button> </div> </template> <script> export default { methods: { triggerCustomEvent() { // 触发定义事件,并传递数据给父组件 this.$emit('custom-event', 'Hello, parent!'); } } } </script> ``` 当子组件的按钮被点击时,`triggerCustomEvent` 方法会调用 `$emit` 方法来触发 `custom-event` 自定义事件,并将 `'Hello, parent!'` 数据传递给父组件。父组件注册的 `handleCustomEvent` 方法会被调用,并接收到传递的数据。 需要注意的是,父组件使用 `@custom-event="handleCustomEvent"` 的语法是监听子组件触发的 `custom-event` 自定义事件,并指定对应的处理函数。这样父组件才能正确地接收到子组件触发的自定义事件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值