前言

上篇介绍了我对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. Python_PyQt5_打开文件并修改字体

    在同文件夹下新建一个 测试文档.txt  再运行下面代码,可以实现效果 代码 1 #!Python3 2 # -*- coding:utf-8 -*- 3 4 """ 5 ...

  2. 03、JDBC范例

    范例:JDBC查询 package com.hsp; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...

  3. web自动化 下拉框、切换到新窗口

    一.下拉框 相信大家在手动测试web页面时,遇到过下拉框吧,那进行web自动化测试时,如何操作下拉框,且看下文 1.selenium中提供了方法,先导入Select方法 from selenium.w ...

  4. laravel数据填充

    post表有这2个字段 填充20条数据, 执行 php artisan tinker 执行预览 factory(App\Post::class,20)->make(); 插入数据库 factor ...

  5. 采集post传输的数据

    采集数据,网页上的数据是开发者通过ajax的post方式显示的,就得用到curl以及它的跨域方法 代码: $post_data------post传过去的参数 $ch = curl_init(); $ ...

  6. python+selenium利用cookie记住密码

    先上代码 1 from selenium import webdriver 2 from time import sleep 3 4 dr = webdriver.Chrome() 5 dr.get( ...

  7. C++基础入门知识:C++命名空间(名字空间)详解

    一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突.当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突. 例如小李和小韩都参 ...

  8. mq消息

    同步,异步,单向 Message的扩展属性主要包含下面几个: tag:消息tag,用于消息过滤 keys:Message索引键,用多个空格隔开,可以根据这些key快速检索到消息 waitStoreMs ...

  9. 02-Python里字符串的常用操作方法--split()函数和join()函数

    1.split() --分割,返回一个列表, 会丢失分割字符 实例: my_str = 'you and me and he' list01 = my_str.split('and') list02 ...

  10. WireShark抓包分析以及对TCP/IP三次握手与四次挥手的分析

    WireShark抓包分析TCP/IP三次握手与四次挥手 Wireshark介绍: Wireshark(前称Ethereal)是一个网络封包分析软件.功能十分强大,是一个可以在多个操作系统平台上的开源 ...