Vue(一)父子组件通信
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(一)父子组件通信相关推荐
- Vue.js 父子组件通信的十种方式;告诉世界前端也能做 AI;你可能不知道的14个JavaScript调试技巧...
记得点击文章末尾的"阅读原文"查看哟~ 下面先一起看下本周的摘要吧~ 想了解老用户如何参与阿里云双十一1折拼团特惠主机的,可以看第二条推送,文中提供了两种方法~,一起看看本周有哪些 ...
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- Vue 非父子组件通信 (ref)
Vue 非父子组件通信 (ref) 流程:1. 先在son子组件中定义一个数据和事件处理程序data( ) { return { flag: false }} , methods: { cry( ) ...
- Vue的父子组件通信(十种)
设计的面试题 Vue中父子组件通信有哪些方式? 概述 通信方式无外乎就那几种: Prop 常用$emit 组件封装用的较多.sync 语法糖 (较少)$attrs和$listeners(组件封装用的较 ...
- html中的父子通信代码,Vue.js 父子组件通信的十种方式
面试官:Vue 中父子组件通信有哪些方式? 自己先想一分钟. 无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽,社区活跃,第三方套件还多.真的是前端开发人员必备 ...
- Vue 非父子组件通信
前面的话 在实际业务中,除了父子通信外,还有很多非父子组件通信的场景,非父子组件一般有两种,兄弟组件和跨多级组件.Vue.js 2.x中,使用一个空的Vue实例作为中央事件总线(bus). 中央事件总 ...
- 【Vue】父子组件通信
[Vue]父子组件通信 前言 父组件向子组件传值 法一: props 法二: $parent 子组件向父组件传值 $emit $emit + .sync $refs v-model 前言
- VUE非父子组件通信Bus——公交车踩坑笔记
抛开父子组件的通讯,对于非父子组件通信,简单的数据交互,使用Bus是非常不错的. 遇到的坑有两个. 1.两个组件的信息交互代码写在哪个生命周期函数中,如果只是点击组件A标签触发函数,然后向界面B传递参 ...
- vue:父子组件通信
页面增加展示文字 1.进入demo-project项目的src\components目录下新建views目录,并新建First.vue文件 2.进入router目录下的index.js并配置路由路径: ...
- vue的父子组件通信
父子组件通信: 1.父组件向子组件传递数据,子组件可以使用 props 接收父组件的数据 2.子组件可以使用this.$emit触发父组件的自定义事件 父组件通过props向子组件传递数据 第一步:需 ...
最新文章
- 限制输入框只能输入数字
- TIOBE 1 月榜单:Python年度语言四连冠,C 语言再次第一
- java string blob_java String类型转换为Blob类型
- 小程序源码 租房管理系统_租房小程序解决方案
- Spring Cloud with Turbine
- Python 也能干大事 —— 解方程
- 58节沈大海H5edu.cn2016javaScript视频教程打包下载
- 浙江大学内部Python教程(教材PDF, PPT课件, 源码)
- PyTorch实现TPU版本CNN模型
- seaborn的多样化图表及图表样式设置
- 【论文简述】CVP-MVSNet:Cost Volume Pyramid Based Depth Inference for Multi-View Stereo(CVPR 2020)
- Java代码混淆工具ProGuard
- 苹果手机点击输入框input 页面放大 超出屏幕问题
- Unity相机漫游脚本
- 不只是C2M:淘宝特价版的“产业数字化”野望
- 定格动画android,定格动画安卓版下载-定格动画最新版下载v2.2.2-一听下载站
- 小森生活服务器维护公告,小森生活2021年5月11日停服更新公告
- form表单如何不直接提交?
- 利用 Google API 调用谷歌地图 演示1
- 高级弥散模型:单指数、IVIM、DKI、SEM、FROC、CTRW