Vue-组件传值:子传父和兄弟组件间常见的传值方式
前言
上篇介绍了我对vue组件化的理解和父组件对子组件传值的方式,这篇介绍下常见的子传父和兄弟组件间的传值方式
目录
- 子组件向父组件传值
- 任意组件间的传值方式
正文
子组件向父组件传值
关键知识点:$emit
<div id="app">
<child-div @a='handleTotal'></child-div>
{{total}}
</div>
<script>
//定义子组件
Vue.component('child-div',{
data(){
return{
counter:0,
}
},
template:'<span @click="handleCounter">点我加一{{counter}}</span>',
methods:{
//点击时候子组件加1,父组件加2
handleCounter(){
this.counter ++
console.log('###########');
this.$emit('a',2)
}
}
})
new Vue({
el:'#app',
data:{
total:0,
},
methods:{
handleTotal(e){
console.log('@@@@@@@@@@@');
console.log(e);
this.total+=e
}
}
})
</script>
分析:定义子组件,并且定义子组件的点击事件,子组件通过点击事件触发$emit方法,向父组件弹出a方法,父组件通过监听这个a方法定义handleTotal方法,从而父组件接收到子组件传来的值,这样实现了子组件加一父组件加二效果。
这里遇到的一个坑:我用到的vue.js版本为https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js,在$emit()中注册的给父组件弹出的方法名必须全部用小写字母,只要方法名中存在大写字母就无法实现该效果,但是也不会报错。
任意组件的传值方式
关键知识点:事件总线EventBus
任意两个组件之间进行通讯,需要借助事件总线(一个空的vue实例)来触发事件和监听事件,从而实现组件之间的通信。包括父子,兄弟,以及跨级组件都可以使用。
<div id="app">
<data-a></data-a>
<data-b></data-b>
<data-c></data-c>
</div>
<template id="a"><div>
<button @click='atoC'>A将数据传递给C</button>
我的名字是:{{name}}</div>
</template>
<template id="b"><div>
<button @click='btoC'>B将数据传递给C</button>
我的年龄是:{{age}}</div>
</template>
<template id="c"><div>
<span>我接受到的参数是</span>
{{name}}========={{age}}</div>
</template>
<script> var Event = new Vue();
var a = Vue.component(
'data-a', {
template: '#a',
data() {
return {
name: 'Tom'
}
},
methods: {
atoC() {
// console.log('aaaaaaaaaaaaaaaaaaaa');
Event.$emit('data-a', this.name)
// console.log('atoc success');
}
}
}
)
var b = Vue.component(
'data-b', {
template: '#b',
data() {
return {
age: 20
}
},
methods: {
btoC() {
Event.$emit('data-b', this.age)
}
}
}
)
var c = Vue.component(
'data-c', {
template: '#c',
data() {
return {
name: 'name',
age: 'age'
}
},
mounted() {
// console.log('@@@@@@@@@@@@@@');
Event.$on(
'data-a', name => {
this.name = name;//箭头函数不产生新的this,这里如果不用箭头函数,this指代Event
}
)
Event.$on(
'data-b', age => {
this.age = age;
}
)
}
}
)
new Vue({
el:'#app',
components:{
'data-a':a,
'data-b':b,
'data-c':c
}
})
分析:定义abc三个组件,注册一个全局的事件总线var Event = new Vue();然后a向c传值的时候通过Event调用$emit(事件名,数据)发送数据,c组件通过Event.$on(事件名,data=>{})接收数据。
就相当于注册一个事件总线存起来,等触发事件时再调用。定义一个类去处理事件,并挂载到vue实例的this上即可注册和触发事件,也可以扩展一些事件管理。
Vue-组件传值:子传父和兄弟组件间常见的传值方式的更多相关文章
- Vue ---- 组价 组件化 子传父 父传子
目录 补充js的for循环: 组件 1.组件的分类: 2.组件的特点 3.创建局部组件 4.全局组件 二.组件化 一.组件传参父传子 二.组件传参:子传父 补充js的for循环: // for in遍 ...
- React组件介绍与使用(父传子、子传父、兄弟传)
1.创建组件的方法 1.1.函数式无状态组件 1.1.1.语法 1 function myComponent(props) { 2 return 3 <div>Hello {pro ...
- Vue学习笔记-组件通信-子传父(自定义事件)
props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...
- 总结vue中父向子,子向父以及兄弟之间通信的几种方式
子向父方式1:通过props,如例子中子组件test1.vue向父组件App.vue传值 App.vue代码 <template> <div id="app"&g ...
- vue传值 ---- >> 子传父,$emit()
划重点: $emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数. 子组件: 1 <template& ...
- 深度剖析Vue中父给子、子给父、兄弟之间传值!
本片文章将为您详细讲解在Vue中,父给子传值.子给父传值以及兄弟之间传值方式! 父传子:父组件 // template里面 <aa :info="name"/> // ...
- Blazor和Vue对比学习(基础1.4):事件和子传父
Blazor和Vue的组件事件,都使用事件订阅者模式.相对于上一章的组件属性,需要多绕一个弯,无论Blazor还是Vue,都是入门的第一个难点.要突破这个难点,一是要熟悉事件订阅模式<其实不难& ...
- vue的组件通讯 父传子 -- 子传父-- 兄弟组件的传值 vue的组件传值
首先文字简单撸一下 父子传子 -------首先在父组件上绑定一个属性,在子组件里用props接收,可以是数组或者是对象 子传父 ------在父组件升上自定义一个方法,在子组件里通过this ...
- vue 组件之间相互传值 父传子 子传父
1.父传子 把要传入的值放到父标签里 子组件使用props接收 父写法 子写法 2.子传父 子组件: childrenOnclick() { // 发布自定义事件 this.$emit(" ...
随机推荐
- Mysql_笔记2018.1.29
1.主要数据库 Oracle MySQL Sqlsever 微软 MongoDB (非关系型数据库) 2.MySql 专业词语 1.数据库:一些关联表的集合 2.数据表:表示数据的矩阵 3.列:同ex ...
- 数据结构实训——哈夫曼(Huffman)编/译码器
题目4.哈夫曼(Huffman)编/译码器(限1人完成) [问题描述] 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先 ...
- 原生sql查询返回结果集处理方法
今天博主用原生写查询的时候发现,查询出来的居然不是我数据表里的数据,而是一个对象 object(mysqli_result)#2 (5) { ["current_field"]=& ...
- leetcode117. 填充每个节点的下一个右侧节点指针 II
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...
- 执行文件异常报错:ImportError: attempted relative import with no known parent package
这个问题困扰了我很久了,网上的解决方法都很一致,找来找去都是一样的解决方法,在导入包的文件和执行文件加入 1 print('__file__={0:<35} | __name__={1:< ...
- Thread.start() ,它是怎么让线程启动的呢?
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
- 安装kibana7.7.0
ELK·Elastic Stack Elastic Stack就一套日志分析系统,前身叫ELK. E:Elasticsearch L:Logstash,日志收集系统 K:Kibana,数据可视化平台 ...
- redis cluster下的pipeline
因为key在cluster分布在不同的slot,可能在不同的机器,部分redis的客户端(比如jedis)是不支持pipeline的 针对jedis我们可能要先把这些key对应的slot手机起来,得到 ...
- LaTeX相关自学文档
install-latex-guide-zh-cn: lshort-zh-cn: 百度网盘链接:https://pan.baidu.com/s/1cBv9Fu8KFaf0QFZ7_slxmw 提取码: ...
- Cisco交换机常见配置
-------查看当前系统基础信息-------- sh version //查看当前IOS版本. sh running-config //查看当前系统中运行的配置信息 -------清除当前系统配置 ...