vue中自定义组件为什么要加.native


在自定义组件或者组件库中的组件上加事件时,无法生效。因为在自定义组件上注册事件触发的是组件自定义的事件。

例如:
自定义Button.vue组件

<template>
  <button type="button" @click="clickHandler"><slot /></button>
</template>
export default {
  name: 'button',
  methods: {
    clickHandler () {
      this.$emit('vclick') // 触发 `vclick` 事件
    }
  }
}

引用Button.vue组件

<vButton @click="clickHandler" @vclick="vClickHandler">按钮</vButton>
import vButton from '@/components/Button'
export default {
  components: { vButton },
  methods: {
    clickHandler () {
      alert('onclick') // 此处不会执行 因为组件中未定义 `click` 事件
    },
    vClickHandler () {
      alert('onvclick') // 触发 `vclick` 自定义事件
    }
  }
}

如果将上面模版改成

<vButton @click.native="clickHandler" @vclick="vClickHandler">按钮</vButton>

那么两个事件都会执行, .native 修饰符就是用来注册元素的原生事件而不是组件自定义事件的

至于你说的 muse-ui 中的自定义组件去掉 .native 也可以执行 想必是为了方便做了兼容处理

<template>
  <!-- 此处自定义事件名也叫 `click` 所以在使用组件时加不加 `.native` 修饰符都可以 -->
  <button type="button" @click="$emit('click')"><slot /></button>
</template>

文章作者: 崔行建
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 崔行建 !
评论
 本篇
vue中自定义组件为什么要加.native vue中自定义组件为什么要加.native
在自定义组件或者组件库中的组件上加事件时,无法生效。因为在自定义组件上注册事件触发的是组件自定义的事件。 例如:自定义Button.vue组件 <template> <button type="button" @cli
2021-06-10
下一篇 
elementui轮播图点击失效 elementui轮播图点击失效
当使用elementui中的走马灯轮播时,想要实现点击轮播项跳转页面功能时,发现点击失效,百度了一下找到了解决方法。 <div class="swipertext"> <div class="img">&l
2021-06-10
  目录