Vue.js 组件 - 自定义事件

一、自定义事件作用

父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件

二、如何使用自定义事件

可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:

  • 使用 $on(eventName,fn) 监听事件
  • 使用 $emit(eventName, data) 触发事件
<template>
  <div>
    <p><a @click="click()">click</a></p>
  </div>
</template>

<script>
export default {
  name: "CT",
  props: {
    id: {
      type: String,
      default: "CT",
    },
  },
  data() {
    return {};
  },
  mounted() {
    console.log(this.$options.name);
  },
  methods: {
    click() {
      this.$emit("getData", "from CT data");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT ref="ct"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
  name: "BT",
  components: { CT },
  data() {
    return {};
  },
  mounted() {
    this.$refs.ct.$on("getData", (data) => {
      console.log(data);
    });
  },
  methods: {},
};
</script>

三、$on(eventName,fn)另一种写法

父组件可以在使用子组件的地方直接用 v-on:eventName@eventName) 来监听子组件触发的事件。

<template>
  <div>
    <p><a @click="click()">click</a></p>
  </div>
</template>

<script>
export default {
  name: "CT",
  props: {
    id: {
      type: String,
      default: "CT",
    },
  },
  data() {
    return {};
  },
  mounted() {
    console.log(this.$options.name);
  },
  methods: {
    click() {
      this.$emit("getData", "from CT data");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT v-on:getData="getData($event)"></CT>
    <CT @getData="getData2($event)"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
  name: "BT",
  components: { CT },
  data() {
    return {};
  },
  mounted() {},
  methods: {
    getData(event) {
      console.log("getData: ", event);
    },
    getData2(event) {
      console.log("getData2: ", event);
    },
  },
};
</script>

四、自定义事件只触发一次$once(eventName,fn)

<template>
  <div>
    <p><a @click="click()">click</a></p>
  </div>
</template>

<script>
export default {
  name: "CT",
  props: {
    id: {
      type: String,
      default: "CT",
    },
  },
  data() {
    return {};
  },
  mounted() {
    console.log(this.$options.name);
  },
  methods: {
    click() {
      this.$emit("getData", "from CT data");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT ref="ct"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
  name: "BT",
  components: { CT },
  data() {
    return {};
  },
  mounted() {
    this.$refs.ct.$once("getData", (data) => {
      console.log(data);
    });
  },
  methods: {},
};
</script>

五、解绑$off('eventName')

<template>
  <div>
    <p><a @click="click()">click</a></p>
  </div>
</template>

<script>
export default {
  name: "CT",
  props: {
    id: {
      type: String,
      default: "CT",
    },
  },
  data() {
    return {};
  },
  mounted() {
    console.log(this.$options.name);
  },
  methods: {
    click() {
      this.$emit("getData", "from CT data");
    },
  },
};
</script>
<template>
  <div>
    <p>BT - <span @click="offEvent()">offEvent</span></p>
    <CT ref="ct"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
  name: "BT",
  components: { CT },
  data() {
    return {};
  },
  mounted() {
    this.$refs.ct.$on("getData", (data) => {
      console.log(data);
    });
  },
  methods: {
    offEvent() {
      this.$refs.ct.$off("getData");
    },
  },
};
</script>
  • vm.$off('eventName'):解绑一个自定义事件
  • vm.$off(['eventName', 'demo']):解绑多个自定义事件
  • vm.$off():解绑所有的自定义事件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值