美文网首页
关于在Vue中给子组件注册点击事件的一些研究

关于在Vue中给子组件注册点击事件的一些研究

作者: e93a88ffeabd | 来源:发表于2018-03-10 23:15 被阅读0次

前言

前两天在使用vue做项目的时候遇到了一个小问题。我自己写了一个公共组件,由于在不同的父组件中对其点击后要执行的逻辑不同,所以要在不同的父组件中监听不同的点击事件。但是我发现在父组件中无法监听到自己的点击事件
注:由于公共组件可以当作子组件进行使用,所以我遇到的问题在子组件中也会遇到。在后文中我们子组件

问题复现

先上代码:

<!-- 父组件 -->
<template>
  <div>
    <common @click="showName"></common>
  </div>
</template>

<script>
export default {
  name: 'hello',
  methods: {
    showName () {
      console.log('Hello')
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <div class="content-box"></div>
</template>

<script>
export default {
  name: 'common'
}
</script>
  1. 当我点击了子组件(粉色盒子)后本想着打印出来其父组件的名称‘Hello’,但是却并没有任何东西打印出来


    父组件名称未打印
  2. 随后我在子组件上注册了一个点击事件,再次对其进行点击,这回打印的结果是子组件自己的名字‘common’


    子组件名称被打印
  3. 通过上两步的测试,我发现如果想在子组件上直接监听父组件的点击事件无法成功

解决方法

解决方法很简单,其实在父组件中注册点击事件的时候加一个.native修饰符就可以了。根据Vue2.0官方文档关于父子组件通讯的原则,父组件通过prop传递数据给子组件,子组件触发事件给父组件。但父组件想在子组件上监听自己的click的话,需要加上.native修饰符

<!-- 父组件 -->
<template>
  <div>
    <!-- 在父组件的点击事件上添加修饰符 -->
    <common @click.native="showName"></common>
  </div>
</template>

<script>
export default {
  name: 'hello',
  methods: {
    showName () {
      console.log('Hello')
    }
  }
}
</script>

再次执行代码:


打印出父组件名称

其他想法

之所以写这个是因为当我后来用到element-ui后发现在element中点击事件可以通过监听change事件进行触发并且也没有添加任何的修饰符。由于没有查看element的源码,所以具体的实现不太清楚,但是稍微思考了下,我自己仿做了个:
想实现这个方法我们用到的是vue的自定义事件。具体的思路就是当我们的子组件被点击的时候,使用$emit触发父组件监听的change事件就可以了
稍微改造下刚刚的代码:

<!-- 父组件 -->
<template>
  <div>
    <common @change="showName"></common>
  </div>
</template>

<script>
export default {
  name: 'hello',
  methods: {
    showName () {
      console.log('Hello')
    }
  }
}
</script>

<!-- 子组件 -->
<template>
  <div class="content-box" @click="emitFn"></div>
</template>

<script>
export default {
  name: 'common',
  methods: {
    showName () {
        console.log('common')
    },
    emitFn () {
      this.$emit('change')
    }
  }
}
</script>
  1. 在上面的代码中,我将子组件的点击事件改成了emitFn,当子组件被点击后触发父组件监听的change事件
  2. 在父组件中,监听子组件触发的change事件,当子组件触发后,执行showName函数,从而打印出名字

总结

  1. 根据Vue2.0官方文档关于父子组件通讯的原则,父组件通过prop传递数据给子组件,子组件触发事件给父组件。但父组件想在子组件上监听自己的click的话,需要加上.native修饰符
  2. 可以利用vue的自定义事件实现不添加.native修饰符即可监听父组件自身的事件,如果想要监听其他的事件,只要在子组件中添加相应的触发即可

相关文章

  • 关于在Vue中给子组件注册点击事件的一些研究

    前言 前两天在使用vue做项目的时候遇到了一个小问题。我自己写了一个公共组件,由于在不同的父组件中对其点击后要执行...

  • 组件事件传值(子组件传值给父组件)

    组件事件传值(子组件传值给父组件) a.在子组件中创建一个按钮,给按钮绑定一个点击事件 b.在响应该点击事件的函数...

  • Vue父子组件之间的通信

    在Vue中,父子组件的关系可以总结为,父组件通过prop向下传递,给子组件发数据,子组件通过事件给父组件发送消息。...

  • vue2.0中组件之间的信息传递

    在vue2.0中父组件给子组件传递信息父组件 子组件 总结 父组件导入子组件 父组件中注册子组件 把需要传递给子组...

  • Vue-自定义事件

    在父组件使用prop 传递数据给子组件,子组件则是通过事件传递数据给父组件的。 Vue实例都会实现事件接口: 1....

  • vue组件

    关于vue组件的总结 注册组件 vue中组件的注册分为两种: 全局注册 局部注册 全局注册 全局注册的组件在任何v...

  • React Native 函数回调

    子组件传递事件到父组件 碰到一个需求是:在子组件中点击按钮,需要将点击事件传递到父组件中,这个需求在iOS中可以很...

  • 2018-04-12 vue父子组件间的通信

    vue + iview 关于父组件模态框内嵌子组件点击确认,执行父组件相应的方法 子组件 this.$emit('...

  • vue组件通信(父子)

    在 Vue 中,父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据...

  • vue 事件传递的原理

    vue的事件机制中,通过父组件模版中@一个事件,子组件emit('xx')事件名的方式实现子组件调用父组件的方法。...

网友评论

      本文标题:关于在Vue中给子组件注册点击事件的一些研究

      本文链接:https://www.haomeiwen.com/subject/irgefftx.html