一、props

props不仅可以实现父给子传递信息,还可以进行子给父传递信息

1.父给子传递信息:

  • 父组件中给子组件实例传递信息

  • 子组件利用props进行接收组件传递信息(接收方式有三种:数组、对象、配置对象)

2.子给父传递信息 (可以利用嵌套从孙组件传递给父组件)

  • 提前在父组件中声名一个函数带传递参数

  • 绑定在子组件(多层组件需要进行嵌套)v-bind、:

  • 子组件进行接收绑定的函数

  • 子组件创建发送数据函数(其中调用传入的接收函数)

  • 将子组建的函数通过事件绑定在指定模板标签中@

//父组件获取数据checkTodo (id) {this.todos.forEach((todo) => {if (todo.id === id) todo.done = !todo.done});}
//将获取数据的方法绑定在子组件(这里就运用了组件嵌套传递)<MyList :checkTodo='checkTodo' /><MyItem :checkTodo='checkTodo' />props: ['checkTodo']//子组件中获取数据props: ['checkTodo'],//子组件中创建发送数据的方法并绑定事件执行此函数(传参)<input @change='handleCheck(todo.id)' />handleCheck (id) {this.checkTodo(id)}

二、自定义事件(子给父传递数据)

自定义事件使用流程

1. 直接在父组件中给子组件实例绑定自定义事件,定义事件的回调,绑定方式v-on、@

此时需要注意自定义事件的名字是自己命名的

如果只需要执行一次还可以使用事件修饰

 <Studnt v-on:xlf.once="getStudentName" @demo="demo" />

2.  还有一个自定义事件的绑定给组件实例方法:通过ref进行绑定

ref绑定优势:可以利用定时器延时绑定:比较灵活

setTimeout(() => { this.$refs.Student.$on('xlf', this.getStudentName) }, 3000)
  • 首先给组件实例添加ref标识

  • 如果存在内置事件使用,需要在自定义事件后添加@native,否则就需要向以下执行方式一样利用$emit()

  <Student ref='Student' @click.native="show" />
  • 在组件挂载钩子的时候执行绑定自定义事件$on('组件名',回调函数)

    • 此时自定义回调要么直接写在$on()中,但是必须要用你箭头函数

      • 因为使用普通函数谁触发了此事件回调中的this就会指向触发的组件实例

    • 还有一种方式提前设置回调函数,然后再$on()中直接调用

 mounted () {this.$refs.Student.$on('xlf', this.getStudentName)
}

3. 在父组件中创建自定义事件的回调函数:可以接收两个参数

  • 自定义事件名字

  • 传递的参数

    getStudentName (name, ...params) {console.log('app收到了学生名', params);this.StudentName = name//传递进来的数据赋值给data中的属性},//用于自定义事件的回调函数demo () {console.log('demo事件被触发');},

4.在子组件中绑定事件并执行发送数据函数

<button @click="sendStudentName">点我获取学生名</button>

5. 在子组件中创建发送数据并直接使用方法:this.$emit('组件名字',其他多个参数)

 sendStudentName () {// $emit:触发,爆发// 触发student实例对象的方法// 添加更多属性值:包装成对象或者将接收换成剩余参数this.$emit('xlf', this.name, 666)this.$emit('demo')},

6.在组件销毁之前或者其他情况需要解绑自定义事件:$off()

  • this.$off('事件名'):解绑指定自定义事件

  • this.$off(['事件名1', '事件名2']):解绑多个指定自定义事件

  • this.$off():解绑所有自定义事件

 unbind () {//只适用解绑一个事件this.$off('xlf')// 解绑多个自定义事件,需要将多个自定义事件写入数组中// this.$off(['xlf', 'demo'])// 解绑的所有事件// this.$off()},

注意:如果需求将子组件延时全部销毁:需要再入口main.js文件中使用

 mounted() {setTimeout(() => {//自杀this.$destroy()},3000)}

三、全局事件总线(任意组件之间的通信)解决兄弟直接通信

1. 读取以下文字并理解兄弟组件传递流程

  • A组件内中收到别人数据,需要在a组件中,给x绑定自定义事件demo,自定义事件的回调函数在a组件中(接收数据处)

  • d组件给a传递数据:d组件中触发x身上的demo自定义事件并传递参数

此时的x不属于任何组件:但是所有组件都可以看到

还需要x可以调用:$on,$emit,$off

2. 实现x能被所有组件看到:这时候需要在入口Vue初始化时候就注册全局事件总线

利用组件实例对象的__protp__=vue原型,此时的vm还有vc都可以看到注册的x

在vue中将总线绑定在当前实例

x是vue中的$bus

 beforeCreate () {// 利用钩子(实例化未进行数据绑定)安装全局总线,vue原型对象上添加一个$bue=当前vue实例Vue.prototype.$bus = this//安装全局事件总线应该在app组件解析过程中而不是解析完成之后,此时的所有vc和vm都可以看到}

3. 确保$on,$emit,$off都可以使用并进行兄弟间组件通信

在注册全局事件总线之后

  • 在兄组件中给全局事件总线绑定自定义事件$on('组件名',回调函数)

//兄:获取数据在全局事件总线上绑定自定义事件
mounted () {// 给总线绑定自定义事件,回调函数在当前组件,如果绑定事件的回调函数直接写在$on中,那么使用箭头函数this.$bus.$on('hello', (data) => {console.log('我是school组件,收到了数据', data)})},
  • 在子组件中调用自定义事件并进行传递数据

//模板绑定事件并执行函数
<button @click="sendStudentName">学生名给school组件</button>
//声名方法调用全局总线中的自定义事件methods: {// 通过全局总线的自定义事件进行发送数据sendStudentName () {this.$bus.$emit('hello', 666)}},

绑定事件总线的自定义事件需要在组件销毁前解绑

 beforeDestroy () {this.$bus.$off('hello')},

注意:利用全局总线绑定自定义事件命名不可以重复

解决:利用一个文件config:在文件中使用某些方式表示当前名字已出现在全局事件总线

四、消息订阅与发布(任意组件之间的通信)

执行消息订阅与发布:

  • 首先执行消息的订阅

  • 接着执行数据的发布

注意:需要引入第三方库:pubsub-js

  • 先进行安装:npm i pubsub-js

  • 然后引入使用

1. 订阅:

  • 引入pubsub

  • 利用api:pubsub.subscrib进行绑定自定义事件(’事件名‘,回调 ),回调可以提前声名,并给其绑定事件一个pubsub的ID

  • 需要销毁订阅:使用pubsub.unsubscribe(绑定事件的id)

  • 注意:回调箭头函数如果直接使用this指向的是undefined,因为是第三方模块,可以利用提前声名的方法

  • 注意:接收参数,会收到自定义事件名字,可以使用占位符进行占位

// 1. 安装好pubsub-js之后引入pubsub
import pubsub from 'pubsub-js'
//2. 订阅消息methods: {// 此处时订阅消息的回调函数//demo (msgName, data)demo (_, data) {console.log('消息收到', msgName, data);}mounted () {
// 订阅消息(注意给订阅id,因为需要被销毁)//参数是消息名,参数this.pubId = pubsub.subscribe('hello', this.demo)
}
//3. 销毁订阅消息:使用api进行取消订阅(注意订阅名字)beforeDestroy () {// this.$bus.$off('hello')pubsub.unsubscribe(this.pubId)},

2.发布

  • 引入pubsub

  • 绑定一个发送数据的方法给当前组件中

  • 执行发布api:pubsub.publish('发布的自定义事件名字',参数)

//1.引入pubsub
import pubsub from 'pubsub-js'
//2.兄弟组件绑定一个事件并执行回调函数
<button @click="sendStudentName">学生名给school组件</button>
//3.回调函数中执行自定义事件并传入参数(发布订阅)methods: {sendStudentName () {pubsub.publish('hello', 666)}},

Vue(组件间通信:props、自定义事件、全局事件总线、消息订阅与发布)相关推荐

  1. 【Vue组件间通信】 全局事件总线、订阅与发布

    目录 一.全局事件总线 作用 安装 组件使用案例 案例分析 组件一(小明) 组件二(小红) 效果展示 二.订阅与发布 安装 组件使用案例 案例分析 组件一(小明) 组件二(小红) 效果展示 一.全局事 ...

  2. Vue 组件间通信方式:自定义事件

    前言 前期分享的测试开发系列!Vue 组件间通信方式汇总,总有一款适合你( 5分钟教程-附项目实战案例 )中介绍了 3 种组件间的通信方法,分别是: props 全局事件总线 消息订阅与发布 今天给大 ...

  3. vue组件间通信六种方式(完整版)

    前言   组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系:                如上图所示 ...

  4. vue组件间通信六种方式

    vue组件间通信六种方式 组件之间的传值通信 组件之间的通讯分为三种:父传子.子传父.兄弟之间的通讯: props/$emit 父传子:主要是通过props来实现的 具体实现:父组件通过import引 ...

  5. Vue.js解析(十)【Vue组件间通信】

    什么是Vue组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊 ...

  6. Vue 组件间通信几种方式(完整版)

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D 都是 ...

  7. vue组件间通信之兄弟组件通信(vue3.0$EventBus)

    vue组件间通信之兄弟组件通信(vue3.0$EventBus) vue组件中的数据传递最最常见的就是父子组件之间的传递.父传子通过props向下传递数据给子组件:子传父通过$emit发送事件,并携带 ...

  8. Vue 组件间通信方法汇总

    Vue 组件间通信方法汇总 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅 除了使用 Vuex 方法外,vue 提供了各种各样的组件间通信的方案.文章整理一下父子组件.兄弟组件.祖先后代组件间 ...

  9. Vue 组件间通信有哪几种方式

    Vue 组件间通信主要指以下 3 类通信:父子组件通信.隔代组件通信.兄弟组件通信 1.props / $emit 适用 父子组件通信 props是父组件将值传给子组件,$emit是子组件通过派发事件 ...

  10. 每日一道面试题:Vue 组件间通信有哪几种方式?

    Vue 组件间通信有哪几种方式? 父子组件通信.隔代组件通信.兄弟组件通信 (1)props / $emit适用 父子组件通信 - 这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不 ...

最新文章

  1. python错误找回_致命的Python错误:无法从堆栈溢出中恢复。洪水期间Fi
  2. Java集合之EnumSet
  3. 图谱问答-句子向量模型部署项目总结(未完)
  4. vector cbegin_vector :: cbegin()函数以及C ++ STL中的示例
  5. 【转载】deque双向队列
  6. 阿里日马云开启直播首秀,谈年轻人压力大:一句话给“骂”醒了!
  7. IOS文件管理-NSFileMangager-NSdata
  8. MATLAB每个字母等宽,等宽文本文件的导入选项对象
  9. TextBox多行输入时,屏蔽回车键
  10. Java Beanutils 配置
  11. 阻塞、非阻塞、同步、异步的区别
  12. 中控考勤机无线连接不上服务器,中控考勤机连接不上电脑的解决方法
  13. 完整制作网吧系统全过程
  14. 博信医药系统连接不到服务器,博信医药管理系统
  15. vmware workstation 9注册码
  16. 简单易懂的宏任务和微任务执行顺序
  17. 蒲公英linux客户端登录提示密码错误的解决方法
  18. GPON技术学习(一)--------GPON系统整体概况
  19. 对象到底是怎么new出来的
  20. 聚合签名、门限签名、Multisigs 和多签名

热门文章

  1. JAVA毕设项目技术的游戏交易平台(java+VUE+Mybatis+Maven+Mysql)
  2. Dubbo入门(一)——了解Dubbo
  3. c语言开发tuxedo客户端,Tuxedo-应用开发.doc
  4. Token登录原理分析
  5. L1-059 敲笨钟 (20 分) (python)
  6. 安科瑞自研电力监控平台ACREL-2000Z
  7. 南邮 | 计算机科学与技术专业历年考试资料分享
  8. 阿里云总裁胡晓明:未来三年追平亚马逊技术
  9. 阿里职位层级解读(附P级详细要求)
  10. android APP隐藏NavigationBar,通过修改framework隐藏/显示 navigation bar