博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue组件通信
阅读量:5877 次
发布时间:2019-06-19

本文共 3593 字,大约阅读时间需要 11 分钟。

被问多了,来做个总结。先约定要用到的父子和兄弟组件,接下来只贴出关键部分代码:

//父组件
import Son from './components/son'export default { name: 'app', components: { Son }}复制代码
//子组件
export default { name: "son", methods:{ }}复制代码

父子组件通信

父组件向子组件通信

1.父组件通过v-bind绑定属性,向子元素传递

//父组件内
export default {... data(){ return { toSonMsg: 'hello son' } },...}复制代码
//子组件
export default { ... props:{ //子组件通过props属性接收注册父组件传递过来的信息 toSonMsg: String },}复制代码

2.父组件通过refs属性调用子组件方法

父组件通过refs来获取子组件实例上的信息:

//父组件
export default {... methods:{ doSonMethods(){ this.$refs.son.changeSomMsg('father come!!!') //调用子组件的changeSomMsg方法 }, },}复制代码
//子组件
export default {... data(){ return { sonMsg: "i'm son" } }, methods:{ changeSomMsg(msg){ this.sonMsg = msg }, }}复制代码

子组件向父组件通信

1.@事件绑定 + $emit事件触发

//父组件
export default {... data(){ return { toSonMsg: 'hello son' } }, methods:{ sonCallBack(msg){ //绑定的事件 this.toSonMsg = msg } },}复制代码
//子组件
export default {... props:{ toSonMsg: String }, methods:{ sendFather(){ //触发绑定的getSonMsg事件 this.$emit('getSonMsg', 'father is get!!') } }}复制代码

2.v-bind事件绑定 + props注册调用

//父组件
//实例部分同上复制代码
//子组件//template部分同上export default {...    props: {        toSonMsg: String,        getSonMsg: Function    },    methods:{        sendFather(){            this.getSonMsg('father is get!!')        }    }}复制代码

3.子组件通过$parent属性获取父组件实例,调用父组件方法

//父组件
export default {... data(){ return { toSonMsg: 'hello son' } }, methods:{ fatherMethods(msg){ this.toSonMsg = msg }, },}复制代码
//子组件
export default {... props: { toSonMsg: String, }, methods:{ getFather(){ this.$parent.fatherMethods('do father methods!!!') }, }}复制代码

父组件和它n层子组件的通信

provide / inject方式(不推荐)

这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

//父组件
export default { ... provide(){ return { msg: this.msg } }, data(){ return { msg: { value: 'i am from father' //provide 和 inject绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。所以要讲变动的数据写成传入的对象的属性。 } } }, methods:{ changeMsg(){ this.msg.value = 'father change!' } }}复制代码
//子组件
export default {... inject: ['msg']}复制代码

兄弟组件通信方式

先要new一个vue的实例当作他们之间的桥,通过新的实例上的on和emit方法进行通信。

//son和son1是兄弟组件,我们需要在新建的bus.js中暴露一个vue的实例//bus.jsimport Vue from 'vue'export default new Vue()复制代码
//son
import bus from '../assets/js/bus'export default { name: "son", data(){ return { sonMsg: "i'm son0!" } }, created(){ bus.$on('changMsg', msg=>{ //监听changMsg事件 this.sonMsg = msg }) },}复制代码
//son1
import bus from '../assets/js/bus'export default { name: "son1", methods:{ changSon0(){ bus.$emit('changMsg', 'son1 change son0!!!!!!') //触发bus上的changMsg事件 } }}复制代码

转载地址:http://ksuix.baihongyu.com/

你可能感兴趣的文章
UIScrollView
查看>>
进制转换学习
查看>>
【ospf-基础配置】
查看>>
课后作业-结对编程项目总结
查看>>
2.python 核心数据类型
查看>>
Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码
查看>>
PyQt QString 与 Python str&unicode
查看>>
bat脚本中的%~的作用
查看>>
jqueryEasyUI form表单提交的一个困惑
查看>>
db2 托管事务未设置方法有问题
查看>>
【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
查看>>
oracle之检查点(Checkpoint)
查看>>
美国数学月刊征解题
查看>>
[zz]Lessons from Pixar: Why Software Developers Should Be Storytellers
查看>>
C# 导出数据到Excel模板中(转)
查看>>
UVA532 Dungeon Master
查看>>
sqlite3开发环境搭建
查看>>
关于Microsoft CRM 2013自动保存Autosave功能的10点说明
查看>>
分页-Page
查看>>
Yii2 自定义独立验证器
查看>>