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:

  1. v-on:tatseSure="sure" 应该这样写:v-on:tatse-sure="sure" 或者 @tatse-sure="sure" , $emit中也改
  2. 确保 sure 是定义在父组件 methods 中的函数

解决方案3:

是方法的命名冲突了 所以导致了这个问题。

最后顺便说下变量监控函数$watch:

vm.$watch(‘a‘, function (newVal, oldVal) {  // 做点什么})

原文地址:https://www.cnblogs.com/sweeeper/p/9067093.html

时间: 2024-10-10 12:27:47

vue之父子组件之间的通信方式的相关文章

vue的父子组件以及非父子组件之间的通信方式

Vue组件通信 父传子  prop 自定义属性,将父亲的数据传给儿子 1. 在组件标签上使用自定属性 2. 在组件内部通过props来接收自定义属性 3. 子组件接收后既可以在组件里直接使用,不过只能用不能改 <wiz_code_mirror> //父组件 <body>  <div id='app1'>      <!-- 在tp1组件标签上使用 xixi自定义属性 -->    <tp1 :xixi='change'></tp1>

vue非父子组件之间值传递

非父子之间通过一个空的vue实例作为事件总线,相当于一个中转站.这个中转站是所有组件都可以看到的,大家通过这个中转站接收和触发事件. import Vue from 'vue' import App from './App' import router from './router' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, data:{ eventHub:

Vue之父子组件之间的传值

父组件,首先要挂载子组件 如果父组件传值给子组件,则 <transition mode="out-in"> <router-view  :applyList='applyList'  applyPath='flightBstrip'></router-view> </transition> 1.父组件挂载子组件的时候声明属性 applyList,applyPath.(applyList是变量,flightBstrip是字符串) 2.子组件

【转】vue父子组件之间的通信

vue父子组件之间的通信 在vue组件通信中其中最常见通信方式就是父子组件之中的通性,而父子组件的设定方式在不同情况下又各有不同.最常见的就是父组件为控制组件子组件为视图组件.父组件传递数据给子组件使用,遇到业务逻辑操作时子组件触发父组件的自定义事件.无论哪种组织方式父子组件的通信方式都是大同小异. 父组件到子组件通讯 父组件到子组件的通讯主要为:子组件接受使用父组件的数据,这里的数据包括属性和方法(String,Number,Boolean,Object, Array ,Function).v

Vue组件~父子组件之间的通信(传值)

1.父组件向子组件传参 父组件中通过v-bind对要传参数的绑定:(例如) :dataSourceName:是在子组件中要用到的值 "ctpSaveEchartSetting.dataSourceId":是在父组件中要传的值 子组件中的接收通过props(数据值单项绑定的)进行接收:(例如) 注:在props中有的变量就不能再data中再定义,或通过监测.计算属性直接去改变,因为js中的对象和数组是引用对象,指向同一个内存空间,如果在子组件中改变props中的值会影响到父组件中的值的状

Vue中非父子组件传值的问题

非父子组件之间的通信,必须要有公共的实例(可以是空的),才能使用 $emit 获取 $on 的数据参数,实现组件通信 第一个组件的数据传递给第二个组件 公共实例文件bus.js,作为公共数控中央总线 import Vue from "vue"; export default new Vue(); 第一个组件 first.vue import Bus from '../bus.js'; export default { name: 'first', data () { return {

React 组件基本使用(3) ---父子组件之间的通信

当有多个组件需要共享状态的时候,这就需要把状态放到这些组件共有的父组件中,相应地,这些组件就变成了子组件,从而涉及到父子组件之间的通信.父组件通过props 给子组件传递数据,子组件则是通过调用父组件传给它的函数给父组件传递数据. 很简单的一个例子,我们在输入框中输入温度,输入框下面显示冷和热.这里就有两个组件,输入框和它下面的显示内容,且它们共享一个状态,就是温度.所以我们要把温度这个状态放到这两个组件的父组件中.这里就有三个组件,一个输入框TemperatureInput,  一个是显示内容

Vue.js父子组件如何传值

https://blog.csdn.net/qq_40259641/article/details/81265950 Vue.js父子组件如何传值 通俗易懂原创 阿猫阿狗哈 发布于2018-07-28 22:04:42 阅读数 14278 收藏展开父子组件传值原理图 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue2.Child.vue的中创建props,然后创建一个名为message的属性 3.在A

通俗易懂了解Vue组件之间的通信方式

1.前言 Vue框架倡导组件化开发,力求将一个大的项目拆分成若干个小的组件,就如同我们小时玩堆积木一样,一个大房子是由若干个小积木组成.组件化开发最大问题就是组件之间数据能够流通,即组件之间能够通信.而组件间通信无非就分为三种情况:外层的大组件向内部的小组件通信,内部的小组件向外部的大组件通信,平级之间组件通信.说的官方一点就是: 父组件与子组件通信 子组件与父组件通信 非父子组件通信 针对这三种情况,下面将一一展开介绍. 2.父组件 - -> 子组件 父组件向子组件传递数据通过props.通俗