[Vue.js][踩雷篇] Vue v-on:click does not work on component

剛使用 Vue 進行前端開發的項目,往往會碰到一些自己想不到的問題與細節,在 Vue.js 踩雷篇 的主題中進行紀錄:

問題:

  • Vue v-on:click does not work on component
  • Vue 的 component 上使用 v-on 來綁定 click 等事件沒有反應


情境:

以下為 webpack vue load 的開發環境

template file: button.vue

<template lang="html">
  <button>按鈕</button>
</template>

<script>
export default{
 name: 'button'
}
</script>

main file : main.vue

<template lang="html">
 <div>
   <navButton @click="alertMsg"></navButton>
 </div>
</template>

<script>
import navButton from './button'

export default{
  name: 'main',
  components:{
    navButton
  },
  methods:{
    alertMsg () { alert("click event is happen")}
  }
}
</script>

你會發現 on:click 這個事件下的 function 是不會被執行的


解決方法:

在 @click 後面,加上 native 的屬性如下:

<navButton @click.native="alertMsg"></navButton>

组件想在子组件上监听自己的click的话,需要加上native修饰符,故寫法就像上面这样


使用 屬性 prop 傳遞方法給子組件

template file: button.vue

<template lang="html">
  <button @click="emitClick">按鈕</button>
</template>

<script>
export default{
  props: {
    fn: {
      type: Function
    }
  },
  methods: {
    emitClick () {
      this.$emit('click', this.fn)
    }
  }
}
</script>

main file : main.vue

<template lang="html">
 <div>
   <navButton @click="alertMsg"></navButton>
 </div>
</template>

<script>
import navButton from './button'

export default{
  name: 'main',
  components:{
    navButton
  },
  methods:{
    alertMsg () { alert("click event is happen")}
  }
}
</script>

在 Vue render 的週期內,自己註冊 on:click 的事件:

template file: button.vue

<script>
export default {
  render (creatElement) {
    return creatElement('button', {
      on: {
        click: () => this.$emit('click')
      }
    }, this.msg)
  }
}
</script>

main file : main.vue

<template lang="html">
 <div>
   <navButton @click="alertMsg"></navButton>
 </div>
</template>

<script>
import navButton from './button'

export default{
  name: 'main',
  components:{
    navButton
  },
  methods:{
    alertMsg () { alert("click event is happen")}
  }
}
</script>

以上的方法都是 Vue v-on:click does not work on component 的解決方案,目標都是一樣的,在這邊提供 3 個方式供參考

(完)

Facebook 功能: