前言

上篇介绍了我对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-组件传值:子传父和兄弟组件间常见的传值方式的更多相关文章

  1. Vue ---- 组价 组件化 子传父 父传子

    目录 补充js的for循环: 组件 1.组件的分类: 2.组件的特点 3.创建局部组件 4.全局组件 二.组件化 一.组件传参父传子 二.组件传参:子传父 补充js的for循环: // for in遍 ...

  2. React组件介绍与使用(父传子、子传父、兄弟传)

    1.创建组件的方法     1.1.函数式无状态组件 1.1.1.语法 1 function myComponent(props) { 2 return 3 <div>Hello {pro ...

  3. Vue学习笔记-组件通信-子传父(自定义事件)

    props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...

  4. 总结vue中父向子,子向父以及兄弟之间通信的几种方式

    子向父方式1:通过props,如例子中子组件test1.vue向父组件App.vue传值 App.vue代码 <template> <div id="app"&g ...

  5. vue传值 ---- >> 子传父,$emit()

    划重点: $emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数.   子组件:   1 <template& ...

  6. 深度剖析Vue中父给子、子给父、兄弟之间传值!

    本片文章将为您详细讲解在Vue中,父给子传值.子给父传值以及兄弟之间传值方式! 父传子:父组件 // template里面 <aa :info="name"/> // ...

  7. Blazor和Vue对比学习(基础1.4):事件和子传父

    Blazor和Vue的组件事件,都使用事件订阅者模式.相对于上一章的组件属性,需要多绕一个弯,无论Blazor还是Vue,都是入门的第一个难点.要突破这个难点,一是要熟悉事件订阅模式<其实不难& ...

  8. vue的组件通讯 父传子 -- 子传父-- 兄弟组件的传值 vue的组件传值

    首先文字简单撸一下 父子传子   -------首先在父组件上绑定一个属性,在子组件里用props接收,可以是数组或者是对象 子传父   ------在父组件升上自定义一个方法,在子组件里通过this ...

  9. vue 组件之间相互传值 父传子 子传父

    1.父传子 把要传入的值放到父标签里  子组件使用props接收 父写法 子写法 2.子传父 子组件: childrenOnclick() { // 发布自定义事件 this.$emit(" ...

随机推荐

  1. Flink处理函数实战之二:ProcessFunction类

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. php 判断网站是http还是https

    //判断是http还是https $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (i ...

  3. Boom 3D快捷方式,让3D音效应用更便捷

    快捷方式是一种快速启动程序.打开程序功能的方法,巧妙地利用快捷键,可以大大加快我们使用Boom 3D的速度,可以让我们更好地享受3D音效. 接下来,就让小编演示一下怎么在不打开Boom 3D的情况下使 ...

  4. DIV设置滚动条在最底端

    网站聊天样式,无论添加什么内容div的滚动条都显示在最底端 将div添加滚动条,给div一定的高度 <div id='up' style='height:100px; width:400px;o ...

  5. jmeter接口测试多数据组合登陆场景

    一.安装好Java运行环境 百度下载JDK并且配置JAVA环境的教程一搜一大把,这里我就不详说了 二.运行JMETER 打开安装目录的bin文件中的jmeter.bat文件 三.添加程序 1.添加线程 ...

  6. 【CF375D】Trees and Queries——树上启发式合并

    (题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...

  7. [BUGCASE]FixedDataTable表格数据渲染错误

    一.问题描述 广告配置中绑定第三方规格ID表格数据,有一部分展示错乱,具体如下: 表格组件使用 Facebook 的 (fixed-data-table) 组件 二.原因分析 1.检查props 先查 ...

  8. Golang性能分析与优化

    在公司的分享,去除了相关的敏感信息.

  9. Django的model.py

    什么是ORM? 对象关系映射 类 >>> 表 对象 >>> 表记录 对象的属性 >>> 一条记录某个字段对应的值 django的orm不能够自动帮 ...

  10. 极简Linux下安装极简桌面

    sudo apt install -y xorg lxde-core vnc4server 设置密码:vncpasswd 然后先开启服务,然后再终止服务:(这是为了创建一个默认的配置文件)vncser ...