vue之父子组件之间的通信方式
(一)props与$emit
<!-这部分是一个关于父子组件之间参数传递的例子-->
<!--父组件传递参数到子组件是props,子组件传递参数到父组件是用事件触发$emit-->
<!OCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<sccipt src="js/vue.js" type="text/javascript"></script>
</head>
<body>
<div id="parent">
<input type="text" v-model="parentMassage" />{{parentMassage}}
</br>
<!--child组件注意点:1.props属性前面加v-bind或者:的时候就变成了动态绑定父组件的值,比如parent-send,绑定的元素只能是小写或者是连短线形式的,这个在子组件的props数组里改成驼峰式的,如果是传递的大小写混合则就传递不了参数了。
2.childmessage传递的参数不要加括号,比如childmessage(data),这个在父组件的函数中获取不到子组件传递的值。-->
</div>
<script>
var child={
template:'<button @click="add" >局部组件:{{childMessage}}</button>',
props:['parentSend'],
data:function(){//子组件中的数据都是以函数返回形式的
return{
childMessage:this.parentSend
}
},
methods:{
add:function(){
var _self=this;
_self.childMessage++;
_self.sendToParent();
},
sendToParent:function(){
debugger
this.$emit('child-message',1);//这里的this是子组件button
}
}
}; var vue=new Vue({
el:"parent",
data:{
parentMassage:111
},
methods:{
childmessage:function(data){
debugger
var _self=this;
_self.parentMessage+=data;//子组件传递来的那个参数值1
}
},
components:{
"child":child
}//注册子组件 })
</script>
</body>
</html>
(二)$emit与$on
var Event = new Vue(); 相当于又new了一个vue实例,Event中含有vue的全部方法;
Event.$emit('msg',this.msg); 发送数据,第一个参数是发送数据的名称,接收时还用这个名字接收,第二个参数是这个数据现在的位置;
Event.$on('msg',function(msg){ 接收数据,第一个参数是数据的名字,与发送时的名字对应,第二个参数是一个方法,要对数据的操作
/这里是对数据的操作
})
例:

1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8" />
5 <title>孙三峰--博客园</title>
6 <script type="text/javascript" src="js/vue2.0.3.js" ></script>
7 <script type="text/javascript">
8 //准备一个空的实例对象
9 var Event = new Vue();
10 var A={
11 template:`
12 <div style="border: 1px solid red; margin-bottom: 10px; width: 300px;">
13 <h4>A组件</h4>
14 <p>{{a}}</p>
15 <input type="button" value="把A数据给C" @click="send" />
16 </div>
17 `,
18 data(){
19 return {
20 a:'我是A里面的数据'
21 }
22 },
23 methods:{
24 send(){ //A发送数据
25 Event.$emit('a-msg',this.a);
26 }
27 }
28 };
29 var B={
30 template:`
31 <div style="border: 1px solid green; margin-bottom: 10px; width: 300px;">
32 <h4>B组件</h4>
33 <p>{{b}}</p>
34 <input type="button" value="把B数据给C" @click="send" />
35 </div>
36 `,
37 data(){
38 return {
39 b:'我是B里面的数据'
40 }
41 },
42 methods:{
43 send(){
44 Event.$emit('b-msg',this.b);
45 }
46 }
47 };
48 var C={
49 template:`
50 <div style="border: 1px dotted green; margin-bottom: 10px;width: 300px;">
51 <h4>我是C组件,我在坐等接收数据</h4>
52 <p>{{a}}</p>
53 <p>{{b}}</p>
54 </div>
55 `,
56 data(){
57 return{
58 a:'',
59 b:''
60 }
61 },
62 mounted(){ //两种接收的方式
63 var _this = this;
64 Event.$on('a-msg',function(a){
65 _this.a=a;
66 });
67 Event.$on('b-msg',function(b){
68 this.b = b;
69 }.bind(this))
70 }
71 };
72 window.onload=function(){
73 new Vue({
74 el:'#box',
75 data:{
76
77 },
78 components:{
79 'com-a':A,
80 'com-b':B,
81 'com-c':C
82 }
83 })
84 }
85 </script>
86 </head>
87 <body>
88 <div id="box">
89 <com-a></com-a>
90 <com-b></com-b>
91 <com-c></com-c>
92 </div>
93 </body>
94 </html>

效果图:



说说(一)中遇到的坑,就是那个$emit总是触发不了的问题,用$emit 实现子组件向父组件传值 报fnsapply is not a function错误,解决方法:
解决方案1:
一样的报错,我是父组件传给子组件
解决方案2:
v-on:tatseSure="sure"应该这样写:v-on:tatse-sure="sure"或者@tatse-sure="sure",$emit中也改确保
sure是定义在父组件methods中的函数
解决方案3:
是方法的命名冲突了 所以导致了这个问题。
最后顺便说下变量监控函数$watch:
vm.$watch('a', function (newVal, oldVal) {
// 做点什么
})
vue之父子组件之间的通信方式的更多相关文章
- 【Vue课堂】Vue.js 父子组件之间通信的十种方式
这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...
- Vue(基础四)_总结五种父子组件之间的通信方式
一.前言 这篇文章主要总结了几种通信方式: 1.方式一:使用props: [ ]和$emit() (适用于单层通信) 2.方式二:$attrs和$listeners(适用于多层) 3.方式三:中央处 ...
- Vue.js 父子组件之间通信的方式
Vue 父子组件之间的同学有一下几种方式: 1. props 2. $emit -- 组件封装用的比较多 3. .sync -- 语法糖 4. $attrs 和 $listeners -- 组件封装用 ...
- vue中父子组件之间的传值、非父子组件之间的传值
在Vue实例中每个组件之间都是相互独立的,都有自己的作用域,所以组件之间是不能直接获取数据.在项目开发中一个组件可能需要获取另一个组件的值,我们可以通过其他方法间接的获取.所以,获取的方法有以下几种: ...
- vue 非父子组件之间的传值(Bus/总线/发布订阅模式/观察者模式)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue 中父子组件之间的交互
1,最直接的也是最简单的方法是利用props来数据传值. 子组件定义如下: props: { iconClass: { type: String, required: true }, classNam ...
- vue非父子组件之间的通信
https://www.cnblogs.com/chengduxiaoc/p/7099552.html //vm.$emit( event, arg ) //触发当前实例上的事件 //vm.$on ...
- 「Vue」父子组件之间的传值及调用方法
a.父组件向子组件传值data(){},props数据区别data中的数据可读可写,是自己的数据props是个数组,中的数据是父组件传递过来的,只读不能写<login :dmsg='msg'&g ...
- Vue非父子组件之间的传值
1.新建一个js文件 然后引入vue 实例化vue 最后暴露这个实例:实例化Vue对象的时候名称要小写,大写控制台报错,我也不知道什么原因: 2.在要广播的地方引入刚才定义的实例: 3通过VueEm ...
随机推荐
- codeforces_1075_C. The Tower is Going Home
http://codeforces.com/contest/1075/problem/C 题意:一个长宽均为1e9的棋盘,n个垂直障碍在x列无限长,m个水平障碍在第y行从第x1列到x2列.可以水平和垂 ...
- chmod - 改变文件的访问权限
总揽 chmod [options] mode file... POSIX 选项: [-R] GNU 选项 (最短方式): [-cfvR] [--reference=rfile] [--help] [ ...
- POJ数据的输入输出格式
POJ在评阅习题时需要向程序提供输入数据,并获取程序的输出结果.因此提交的程序需按照每个习题具体的输入输出格式要求处理输入输出.有的时候,测评系统给出程序的评判结果是“数据错误”或“结果错误”,有可能 ...
- iView webapp / Mint UI / MUI [前端UI]
前端UI iView webapp一套高质量的 微信小程序 UI 组件库 https://weapp.iviewui.com/?from=iview Mint UI 基于 Vue.js 的移动端组件库 ...
- tab切换组件nz-tab
<nz-card [nzBordered]="true" nzTitle="卡片标题"> <nz-card style="width ...
- Webstorm 的 Tab 键调整缩进值
两步即可,注意版本
- 只允许特定IP访问本网站的前端写法
在开发的过程中,有时会遇到只允许特定的几个IP访问.今天来记录一下前端的写法. 首先,引入 <script src="http://pv.sohu.com/cityjson?ie=ut ...
- 记一次被面试的final问题
---- 前言 今天面试被问到了,我们都知道final修饰的东西是不可变的,那么是值不可变还是其地址不可变?一脸懵逼,回来查阅一番,总结一下 --- final与数据 在日常行为下,一般数据指的都是基 ...
- windows 安装 python3
安装python------------------------------------------------------------ 1,打开连接https://www.python.org/do ...
- 关于使用mongodb中遇到的时间戳雷同的问题
文不对题,实际上不是时间戳,而是我们使用js取当前毫秒数,将他看为时间戳,每次updata的时候,获取当前毫秒数,把它当做create_time的默认值,自动添加到我们的数据库中,数据模型如下 开始的 ...