Vue 父子组件通信的三种方案

解决方法


  • 使用props进行通信
  • 使用事件分发机制(EventBus)
  • $parent 属性
  • vuex方式 (后续补充)

结构图

一、 props p r o p s props属性


ref 被用来给子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。

props 是在注册组件的时候进行定义,要保证props中的属性值和ref中的值是对应的。

实现原理

通过在子组件props中定义自定义属性值,然后在父组件ref中引入该自定义属性值,并通过$refs对象传递给子组件。这样就保证了由父组件到子组件的通信。

实现源码

下面的代码演示了,父组件(parent)分别给两个子组件(child),进行传值的过程。

父组件
parent.vue

<template><div class="container"> <Child1 :context="obj.context"></Child1><Child2 :staticImgUrl="obj.url"></Child2></div>
</template>import Child1 from './child1'  // 引入子组件
import Child2 from './child2'  // 引入子组件export default {name: 'parent',components: {Child1       // 添加子组件1Child2       // 添加子组件2},data() {    // 父组件的数据项return {obj: {    //所有数据封装在obj对象中,便于管理url: 'abc.jpg',context:'abcdefg'}};}methods: {}
}

子组件
child1.vue

<template><div class="child"><span>{{ context }}</span></div>
</template>export default {name: 'child',components: {},props:[   // 绑定子组件自身的属性数据'context', // 文本],data() {return {};}methods: {}
}

child2.vue

<template><div class="child"><img src="staticImgUrl" /></div>
</template>export default {name: 'child',components: {},props:[   // 绑定子组件自身的属性数据'staticImgUrl', // 静态图片url],data() {return {};}methods: {}
}

问题一 这种方式是单向通信的(局限性)

使用第一种方式的话,只能由父组件向子组件进行单向传值。子组件是无法满足向兄弟节点或者父节点进行直接通信。
一旦子组件的值发生改变,是无法修改父组件中的值的。

应用场景
父组件是一个容器,有两个子组件分别是表格(iTable)和分页器(iPage),当选中不同对页码时,要对表格内容进行更新。这种情况下使用ref/props就比较鸡肋了。

那么解决方案就是采用第二种方式(EventEmitter)

问题二 子组件修改prop值

所有的prop都是由父组件单向向下绑定的,当父级prop得到更新的时候,子组件的所有prop都将刷新为最新的值。因此,不应该在子组件内部修改prop的值,否则,浏览器的控制台会发出警告!!!

二、 EventBus E v e n t B u s EventBus


通过使用事件中心,允许组件自由交流,无论组件处于组件树的哪一层。由于 Vue 实例实现了一个事件分发接口,你可以通过实例化一个空的 Vue 实例来实现这个目的。

dispatch-和-broadcast-替换

这些方法的最常见用途之一是父子组件的相互通信。

这种方式也就是设计模式中的观察者模式,通过在父组件上注册监听$on事件,当子组件要发消息给父组件的时候,直接发送$emit事件,然后,父组件做相应的操作。

bus.js

let bus = new Vue
export default bus // 创建一个Vue实例进行事件分发

parent

<template><div class="parent"></div>
</template>
export default {name: 'parent',components: {},mounted: () {// 默认监听函数放在mounted中// 监听子节点的notifylet self = thisthis.$on('display', (evt) => {// 通知给子节点2self.$emit('displaySuccess')})},data() {return {};}methods: {}
}

child1


<template><div class="child" @click="dispatch"></div>
</template>
export default {name: 'child1',components: {},data() {return {};}methods: {dispatch () {this.$emit('display')}}
}

child2


<template><div class="child2"></div>
</template>
export default {name: 'child2',components: {},mounted(){//监听父节点的notifythis.$on('displaySuccess', (res) => {// opts...})},data() {return {};}methods: {}
}

三、 $parent/ $ p a r e n t / \$parent/ $refs $ r e f s \$refs 属性

Vue 提供了一种可以从子组件访问父组件的实例$parent
相反,父组件可以访问子组件的实例$refs

$parent 和 $refs 本质上都是组件实例,因此我们可以通过实例对象访问组件内部的方法。

//parent
<template>
<Comp ref="child"></Comp>
</template>
name: 'parent',
components:{Comp // 引入子组件
},
methods: {notifyChild: function () {this.$refs.child.focus() // this.$refs就是Comp组件实例}
}...// child
name: 'Comp',
methods: {focus: function () {console.log('调用子组件',this.$parent) // this.$parent就是parent组件实例}
}

四、 vuex v u e x vuex方式

上述两种方式基本满足日常开发需求,这种方式之后稍后会更新。
待续…

Vue(一)父子组件通信相关推荐

  1. Vue.js 父子组件通信的十种方式;告诉世界前端也能做 AI;你可能不知道的14个JavaScript调试技巧...

    记得点击文章末尾的"阅读原文"查看哟~ 下面先一起看下本周的摘要吧~ 想了解老用户如何参与阿里云双十一1折拼团特惠主机的,可以看第二条推送,文中提供了两种方法~,一起看看本周有哪些 ...

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

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

  3. Vue 非父子组件通信 (ref)

    Vue 非父子组件通信 (ref) 流程:1. 先在son子组件中定义一个数据和事件处理程序data( ) { return { flag: false }} , methods: { cry( ) ...

  4. Vue的父子组件通信(十种)

    设计的面试题 Vue中父子组件通信有哪些方式? 概述 通信方式无外乎就那几种: Prop 常用$emit 组件封装用的较多.sync 语法糖 (较少)$attrs和$listeners(组件封装用的较 ...

  5. html中的父子通信代码,Vue.js 父子组件通信的十种方式

    面试官:Vue 中父子组件通信有哪些方式? 自己先想一分钟. 无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽,社区活跃,第三方套件还多.真的是前端开发人员必备 ...

  6. Vue 非父子组件通信

    前面的话 在实际业务中,除了父子通信外,还有很多非父子组件通信的场景,非父子组件一般有两种,兄弟组件和跨多级组件.Vue.js 2.x中,使用一个空的Vue实例作为中央事件总线(bus). 中央事件总 ...

  7. 【Vue】父子组件通信

    [Vue]父子组件通信 前言 父组件向子组件传值 法一: props 法二: $parent 子组件向父组件传值 $emit $emit + .sync $refs v-model 前言

  8. VUE非父子组件通信Bus——公交车踩坑笔记

    抛开父子组件的通讯,对于非父子组件通信,简单的数据交互,使用Bus是非常不错的. 遇到的坑有两个. 1.两个组件的信息交互代码写在哪个生命周期函数中,如果只是点击组件A标签触发函数,然后向界面B传递参 ...

  9. vue:父子组件通信

    页面增加展示文字 1.进入demo-project项目的src\components目录下新建views目录,并新建First.vue文件 2.进入router目录下的index.js并配置路由路径: ...

  10. vue的父子组件通信

    父子组件通信: 1.父组件向子组件传递数据,子组件可以使用 props 接收父组件的数据 2.子组件可以使用this.$emit触发父组件的自定义事件 父组件通过props向子组件传递数据 第一步:需 ...

最新文章

  1. 限制输入框只能输入数字
  2. TIOBE 1 月榜单:Python年度语言四连冠,C 语言再次第一
  3. java string blob_java String类型转换为Blob类型
  4. 小程序源码 租房管理系统_租房小程序解决方案
  5. Spring Cloud with Turbine
  6. Python 也能干大事 —— 解方程
  7. 58节沈大海H5edu.cn2016javaScript视频教程打包下载
  8. 浙江大学内部Python教程(教材PDF, PPT课件, 源码)
  9. PyTorch实现TPU版本CNN模型
  10. seaborn的多样化图表及图表样式设置
  11. 【论文简述】CVP-MVSNet:Cost Volume Pyramid Based Depth Inference for Multi-View Stereo(CVPR 2020)
  12. Java代码混淆工具ProGuard
  13. 苹果手机点击输入框input 页面放大 超出屏幕问题
  14. Unity相机漫游脚本
  15. 不只是C2M:淘宝特价版的“产业数字化”野望
  16. 定格动画android,定格动画安卓版下载-定格动画最新版下载v2.2.2-一听下载站
  17. 小森生活服务器维护公告,小森生活2021年5月11日停服更新公告
  18. form表单如何不直接提交?
  19. 利用 Google API 调用谷歌地图 演示1
  20. 高级弥散模型:单指数、IVIM、DKI、SEM、FROC、CTRW

热门文章

  1. CF趁手外设选购指南【鼠标、鼠标垫篇】(转)
  2. Elasticsearch聚合查询多字段设置权重
  3. hrtf 旋转音效matlab实现
  4. 数据标注的终点会是众包么?(AI数据标注猿交流社区群欢迎加入)
  5. 只有自律的人才配拥有真正的自由!
  6. 一起了解PCBA中,PCB打样的特殊工艺
  7. 商业MIS系统中成本核算方式的选择
  8. 一文快速掌握 es6+新特性及核心语法
  9. android文本框左右加减按钮长按一直加减
  10. 在计算机控制交流电机过程中,钢板彩涂过程中张力控制系统的研究