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

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

在vue项目实际开发中我们经常会使用props和emit来进行子父组件的传值通信,父组件向子组件传递数据是通过prop传递的,

子组件传递数据给父组件是通过$emit触发事件来做到的。例如:

Vue.component('child',{        data(){            return {                mymessage:this.message            }        },        template:`            
`, props:['message'],//得到父组件传递过来的数据 methods:{ passData(val){ //触发父组件中的事件 this.$emit('getChildData',val) } } }) Vue.component('parent',{ template:`

this is parent compoent!

`, data(){ return { message:'hello' } }, methods:{ //执行子组件触发的事件 getChildData(val){ console.log(val) } } }) var app=new Vue({ el:'#app', template:`
` })

既然是新姿势当然要介绍一下骚操作

1.$attrs和$listeners

  适用场景:父组件A下面有子组件B,组件B下面有组件C,这时候如果A组件想传值给C组件就可以用$attrs和$listeners

Vue.component('C',{        template:`            
`, methods:{ passCData(val){ //触发父组件A中的事件 this.$emit('getCData',val) } } }) Vue.component('B',{ data(){ return { mymessage:this.message } }, template:`
`, props:['message'],//得到父组件传递过来的数据 methods:{ passData(val){ //触发父组件中的事件 this.$emit('getChildData',val) } } }) Vue.component('A',{ template:`

this is parent compoent!

`, data(){ return { message:'hello', messagec:'hello c' //传递给c组件的数据 } }, methods:{ getChildData(val){ console.log('这是来自B组件的数据') }, //执行C子组件触发的事件 getCData(val){ console.log("这是来自C组件的数据:"+val) } } }) var app=new Vue({ el:'#app', template:`
` })

2.provide和inject

适用场景:父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量。不论子组件有多深,只要调用了inject那么就可以注入provider中的数据。而不是局限于只能从当前父组件的prop属性来获取数据,只要在父组件的生命周期内,子组件都可以调用。

Vue.component('child',{        inject:['for'],//得到父组件传递过来的数据        data(){            return {                mymessage:this.for            }        },        template:`            
}) Vue.component('parent',{ template:`

this is parent compoent!

`, provide:{ for:'test' }, data(){ return { message:'hello' } } }) var app=new Vue({ el:'#app', template:`
` })

3.$parent和$child

使用场景:在父组件中可直接通过this.$children操作子组件,子组件中可通过this.$parent修改父组件的值

Vue.component('child',{        props:{            value:String, //v-model会自动传递一个字段为value的prop属性        },        data(){            return {                mymessage:this.value            }        },        methods:{            changeValue(){                this.$parent.message = this.mymessage;//通过如此调用可以改变父组件的值            }        },        template:`            
}) Vue.component('parent',{ template:`

this is parent compoent!

`, methods:{ changeChildValue(){ this.$children[0].mymessage = 'hello'; } }, data(){ return { message:'hello' } } }) var app=new Vue({ el:'#app', template:`
` })

 

转载于:https://www.cnblogs.com/myspecialzone/p/10475584.html

你可能感兴趣的文章
77%的Linux运维都不懂的内核问题
查看>>
webpack学习笔记
查看>>
干货|个性化推荐系统五大研究热点之可解释推荐(五)
查看>>
线性结构 数组与链表
查看>>
springboot上传excel表格到数据库
查看>>
关于谎言
查看>>
精致酒具,享受居家品酒文化
查看>>
107 Binary Tree Level Order Traversal II
查看>>
Android Path测量工具:PathMeasure
查看>>
在spring boot中3分钟上手分布式任务调度系统xxl-job
查看>>
仿微信实现自定义安全数字键盘
查看>>
Flutter 入门指北(Part 10)之手势处理和动画
查看>>
java版spring cloud+spring boot+redis多租户社交电子商务平台 (十一)docker部署spring cloud项目...
查看>>
Category知识点
查看>>
Android UI - 图像绘制与渲染方案
查看>>
ES6之const和let
查看>>
vue1 x 过滤器(三)
查看>>
探索Java并发编程与高并发解决方案
查看>>
树莓派3(Raspberry Pi 3)安装Win10 IoT Core
查看>>
给域控用户分配指定共享目录并定义共享目录大小
查看>>