1. 1 App.vue
  2. 2 <template>
  3. 3 <!--
  4. 4 组件的自定义事件:
  5. 5 1.一种组件间通信的方式,使用于:子组件===>父组件
  6. 6 2.使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)
  7. 7 3.绑定自定义事件:
  8. 8 .第一种方式,在父组件中:<Demo @custonEvent="test"/> <Demo v-on:custonEvent="test"/>
  9. 9 .第二种方式,在父组件中
  10. 10 <demo ref="demo" />
  11. 11 mounted(){this.$refs.demo.on('custonEvent', this.test)}
  12. 12 .若想让自定义事件只杯触发一次,可以使用once事件修饰符,或$once方法
  13. 13 4.触发自定义事件:this.$emit('custonEvent', 数据参数)
  14. 14 5.解绑自定义事件: this.$off('custonEvent');
  15. 15 6.组件上也可以绑定原生DOM事件,需要使用native修饰符
  16. 16 7.注意:通过this.$refs.xxx.$on('custonEvent', 回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题。

  1. 17 -->
  2. 18 <div class="app">
  3. 19 <h1>{{msg}}</h1>
  4. 20 <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 -->
  5. 21 <School :getSchoolName="getSchoolName"/>
  6. 22 <!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据。 -->
  7. 23 <!-- <Student v-on:customEvent.once="getStudentName"/> 事件修饰符同样可以使用 -->
  8. 24 <!-- <Student v-on:customEvent="getStudentName"/> -->
  9. 25 <!-- 通过指定ref,在当前组件挂载完(mounted),的时候绑定自定义事件,这种相对比较灵活,比如:三秒后绑定事件 -->
  10. 26 <!-- 通过native事件修饰符来绑定原生事件 -->
  11. 27 <Student ref="student" @click.native="studentClick"/>
  12. 28 </div>
  13. 29 </template>

  1. 1 全局事件总线(GlobalEventBus)
  2. 2 1.一种组件间通信的方式,适用于任意组件间通信
  3. 3 2.安装全局事件总线:
  4. 4 new Vue({
  5. 5 render: h => h(App),
  6. 6 beforeCreate(){
  7. 7 Vue.prototype.$bus = this;
  8. 8 }
  9. 9 }).$mount('#app');
  10. 10 3.适用事件总线:
  11. 11 a.接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身
  12. 12 methods(){
  13. 13 demo(data){...}
  14. 14 }
  15. 15 ...
  16. 16 mounted() {
  17. 17 this.$bus.$on('xxx', this.demo);
  18. 18 },
  19. 19 beforeDestroy(){
  20. 20 this.$bus.$off('xxx');
  21. 21 }
  22. 22 b.提供数据:this.$bus.$emit('xxx', data);
  23. 23 4.最好在beforeDestroy钩子回调中,用$off去解绑当前组件所用到的事件
  24. 24
  25. 25
  26. 26 消息订阅与发布(pubsub)
  27. 27 1.一种组件间通讯的方式,适用于任意组件间通信。
  28. 28 2.适用步骤:
  29. 29 a.安装pubsub: npm i pubsub-js
  30. 30 b.引入:import pubsub from pubsub-js
  31. 31 c.接受数据:A组件想接受数据,则在A组件中订阅消息,订阅的回调留在A组件自身
  32. 32 methods(){
  33. 33 demo(data){....}
  34. 34 }
  35. 35 ....
  36. 36 mounted(){
  37. 37 this.pid = pubsub.subscribe('xxx', this.demo);//订阅消息
  38. 38 }
  39. 39 beforeDestroy(){
  40. 40 pubsub.unsubscribe(this.pid);
  41. 41 }
  42. 42 d.提供数据:pubsub.publish('xxx', data)
  43. 43 e.最好在beforeDestroy钩子中,用pubsub.unsubscribe(pid)去取消订阅


  1. 30
  2. 31 <script>
  3. 32 import School from './components/School.vue'
  4. 33 import Student from './components/Student.vue'
  5. 34
  6. 35 export default {
  7. 36 name: 'App',
  8. 37 components:{
  9. 38 School,Student,
  10. 39 },
  11. 40 data(){
  12. 41 return {
  13. 42 msg: '你好啊'
  14. 43 }
  15. 44 },
  16. 45 methods:{
  17. 46 getSchoolName(name){
  18. 47 console.log('App getSchoolName:', name);
  19. 48 },
  20. 49 getStudentName(name,...a){ // ...a意思是,将其他参数都放到a上面
  21. 50 console.log('App getStudentName:', name);
  22. 51 console.log('App getStudentName:', a);
  23. 52 }
  24. 53 },
  25. 54 mounted() {
  26. 55 // 绑定自定义事件
  27. 56 this.$refs.student.$on('customEvent', this.getStudentName);
  28. 57
  29. 58 // this.$refs.student.$onece('customEvent', this.getStudentName); 事件修饰符
  30. 59 }
  31. 60 }
  32. 61 </script>
  33. 62
  34. 63 <style>
  35. 64 .app{
  36. 65 background-color: gray;
  37. 66 padding: 5px;
  38. 67 }
  39. 68 </style>
  1. 1 School.vue
  2. 2 <template>
  3. 3 <div class="school">
  4. 4 <h3>学校名字:{{name}}</h3>
  5. 5 <h3>学校地址:{{address}}</h3>
  6. 6 <button @click="sendSchoolName" >把学校名传给App</button>
  7. 7 </div>
  8. 8
  9. 9 </template>
  10. 10
  11. 11 <script>
  12. 12 export default {
  13. 13 name: 'School',
  14. 14 data(){
  15. 15 return {
  16. 16 name: 'BaiYeShu',
  17. 17 address: '深圳'
  18. 18 }
  19. 19 },
  20. 20 props:['getSchoolName'],
  21. 21 methods:{
  22. 22 sendSchoolName(e) {
  23. 23 this.getSchoolName(this.name);
  24. 24 }
  25. 25 }
  26. 26
  27. 27 }
  28. 28 </script>
  29. 29
  30. 30 <style scoped>
  31. 31 .school{
  32. 32 background-color: skyblue;
  33. 33 padding: 5px;
  34. 34 }
  35. 35 </style>
  1. 1 Student.vue
  2. 2 <template>
  3. 3 <div class="student">
  4. 4 <h3>学生姓名:{{name}}</h3>
  5. 5 <h3>学生性别:{{sex}}</h3>
  6. 6 <button @click="sendStudentName">把学生名发送给App</button>
  7. 7 <button @click="unbind">解绑自定义事件</button>
  8. 8 </div>
  9. 9 </template>
  10. 10
  11. 11 <script>
  12. 12 export default {
  13. 13 name: 'School',
  14. 14 data(){
  15. 15 return {
  16. 16 name: '张三',
  17. 17 sex: '男',
  18. 18 }
  19. 19 },
  20. 20 methods:{
  21. 21 sendStudentName(){
  22. 22 // 触发自定义事件
  23. 23 this.$emit('customEvent', this.name, 1,2,3);
  24. 24 },
  25. 25 unbind(){
  26. 26 this.$off('customEvent'); // 解绑指定事件
  27. 27 // this.$off(['customEvent', 'm1']); // 解绑多个事件
  28. 28 // this.$off(); // 解绑所有事件
  29. 29 }
  30. 30 }
  31. 31 }
  32. 32 </script>
  33. 33
  34. 34 <style scoped>
  35. 35 .student {
  36. 36 background-color: pink;
  37. 37 padding: 5px;
  38. 38 margin-top: 30px;
  39. 39 }
  40. 40 </style>

Vue 自定义事件 && 组件通信的更多相关文章

  1. (尚031)Vue_案例_自定义事件(组件间通信第2种方式:vue自定义事件)

    自定义事件: 我们知道,父组件使用prop传递数据的子组件,但子组件怎么跟父组件通信呢? 这个时候Vue的自定义事件系统就派得上用场了. 自定义事件知道两件事: (1).绑定 (2).触发 注意:$o ...

  2. Vue自定义事件

    前面的话 父组件使用props传递数据给子组件,子组件怎么跟父组件通信呢?这时,Vue的自定义事件就派上用场了.本文将详细介绍Vue自定义事件 事件绑定 每个 Vue 实例都实现了事件接口 (Even ...

  3. Vue 非父子组件通信方案

    Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...

  4. Vue的父子组件通信(转载)

    Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子父组件通信的问题 首先我们先搭好开发环境,我们首先得装好git和npm这两个工具(如果有不清楚的同学 ...

  5. Vue学习笔记-组件通信-子传父(自定义事件)

    props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...

  6. vue自定义事件 子组件把数据传出去

    每个 Vue 实例都实现了事件接口(Events interface),即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 1.使用v-on绑定自定义 ...

  7. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

  8. 浅谈vue学习之组件通信

    vue用组件化简化了我们编写代码的复杂度,组件之间经常会出现数据传递的情况,那么组件之间是怎样通信的呢? 使用props传递数据 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内 ...

  9. 【VUE】7.组件通信(二)子组件修改父组件

    1. 前提&知识点 1./components/Father.vue 是父组件, Son.vue 是子组件 2.子组件修改父组件 emit 2. 组件通信 1. 首先对子组件绑定一个事件 ch ...

随机推荐

  1. arts-week11

    Algorithm 69. Sqrt(x) - LeetCode Review Building a network attached storage device with a Raspberry ...

  2. 分享一个 SpringCloud Feign 中所埋藏的坑

    背景 前段时间同事碰到一个问题,需要在 SpringCloud 的 Feign 调用中使用自定义的 URL:通常情况下是没有这个需求的:毕竟都用了 SpringCloud 的了,那服务之间的调用都是走 ...

  3. 理解RESTful Api设计

    REST REST(REpresentational State Transfer)是 Roy Fielding 博士于 2000 年在他的博士论文中提出来的一种软件架构风格(一组架构约束条件和原则) ...

  4. 为什么Java有了synchronized之后还造了Lock锁这个轮子?

    众所周知,synchronized和Lock锁是java并发变成中两大利器,可以用来解决线程安全的问题.但是为什么Java有了synchronized之后还是提供了Lock接口这个api,难道仅仅只是 ...

  5. linux运维基础2

    内容概要 虚拟机关键配置名词解释 远程链接工具 xshell基本使用 linux命令准则 系统运⾏命令 常用快捷方式 文件命令操作 文件编辑命令 内容详情 虚拟机关键配置名词解释 # 虚拟网络编辑器说 ...

  6. node.js环境安装及环境变量

    1.nodejs官网下载对应系统的安装包 2.除了你想自定义安装的路径其他一切一直点next往下走 3.打开cmd命令窗口输入node -v,看到v.xx.xx代表node已经装好 node -v 4 ...

  7. script标签crossorigin属性及同源策略和跨域方法

    首先介绍(同源策略) 同源策略是浏览器最核心且基本的安全约定,要求协议.域名.端口都相同为同源,如果非同源时请求数据浏览器会在控制台抛出跨域异常错误,同源策略是浏览器的行为,即使客户端请求发送了,服务 ...

  8. nodeJS与MySQL实现分页数据以及倒序数据

    大家在做项目时肯定会遇到列表类的数据,如果在前台一下子展示,速度肯定很慢,那么我们可以分页展示,比如说100条数据,每10条一页,在需要的时候加载一页,这样速度肯定会变快了.那么这里我给大家介绍如何在 ...

  9. 深入理解 happens-before 原则

    在前面的文章中,我们深入了解了 Java 内存模型,知道了 Java 内存模型诞生的意义,以及其要解决的问题.最终我们知道:Java 内存模型就是定义了 8 个基本操作以及 8 个规则,只要遵守这些规 ...

  10. 学习笔记-JDBC连接数据库操作的步骤

    前言 这里我就以JDBC连接数据库操作查询的步骤作以演示,有不到之处敬请批评指正! 一.jdbc连接简要步骤 1.加载驱动器. 2.创建connection对象. 3.创建Statement对象. 4 ...