首页 web前端 js教程 vue中$emit 与$on父子兄弟组件操作详解

vue中$emit 与$on父子兄弟组件操作详解

May 22, 2018 am 09:55 AM
emit 操作 组件

这次给大家带来vue中$emit 与$on父子兄弟组件操作详解,vue中$emit 与$on父子兄弟组件操作的注意事项有哪些,下面就是实战案例,一起来看一下。

主要的传输方式有三种:

1.父组件到子组件通信

2.子组件到父组件的通信

3.兄弟组件之间的通信

一、父组件传值给子组件

父组件给子组件传子,使用props

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

//父组件:parent.vue

<template>

  <p>

    <child :vals = "msg"></child>

  </p>

</template>

<script>

import child from "./child";

export default {

  data(){

    return {

      msg:"我是父组件的数据,将传给子组件"

    }

  },

  components:{

    child

  }

}

</script>

//子组件:child.vue

<template>

  <p>

    {{vals}}

  </p>

</template>

<script>

export default {

   props:{ //父组件传值 可以是一个数组,对象

    vals:{

      type:String,//类型为字符窜

     default:"123" //可以设置默认值

    }

  },

}

</script>

登录后复制

2.子组件到父组件的通信

使用 $emit(eventname,option) 触发事件,

参数一:自定义事件名称,写法,小写或者用-连接,如event,event-name 不能写驼峰写法(eventName)

子组件给父组件传值,可以在子组件中使用$emit触发事件的值传出去,父组件通过事件监听,获取数据

但是,这里有一个问题,

1、究竟是由子组件内部主动传数据给父组件,由父组件监听接收(由子组件中操作决定什么时候传值)

2、还是通过父组件决定子组件什么时候传值给父组件,然后再监听接收 (由父组件中操作决定什么时候传值)

两种情况都有

2.1 : $meit事件触发,通过子组件内部的事件触发自定义事件$emit

2.2 : $meit事件触发, 可以通过父组件操作子组件 (ref)的事件来触发 自定义事件$emit

第一种情况:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

//父组件:parent.vue

<template>

  <p>

    <child v-on:childevent=&#39;wathChildEvent&#39;></child>

    <p>子组件的数据为:{{msg}}</p>

  </p>

</template>

<script>

import child from "./child";

export default {

  data(){

    return{

      msg:""

    }

  },

  components:{

    child

  },

  methods:{

    wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据

      console.log(vals);//结果:这是子组件的数据,将有子组件操作触发传给父组件

      this.msg = vlas;

    

  }

}

</script>

//子组件:child.vue

<template>

  <p>

    <input type="button" value="子组件触发" @click="target">

  </p>

</template>

<script>

export default {

  data(){

      return {

      texts:'这是子组件的数据,将有子组件操作触发传给父组件'

      }

  },

  methods:{

    target:function(){ //有子组件的事件触发 自定义事件childevent

      this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet

    }

  },

}

</script>

登录后复制

第二种情况:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

//父组件:parent.vue

<template>

  <p>

    <child v-on:childevent=&#39;wathChildEvent&#39; ref="childcomp"></child>

    <input type="button" @click="parentEnvet" value="父组件触发" />

    <p>子组件的数据为:{{msg}}</p>

  </p>

</template>

<script>

import child from "./child";

export default {

  data(){

    return{

      msg:""

    }

  },

  components:{

    child

  },

  methods:{

    wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据

      console.log(vals);//这是子组件的数据,将有子组件操作触发传给父组件

      this.msg = vlas;

    },

    parentEnvet:function(){

      this.$refs['childcomp'].target(); //通过refs属性获取子组件实例,又父组件操作子组件的方法触发事件$meit

    }

  }

}

</script>

//子组件:child.vue

<template>

  <p>

   <!-- dothing..... -->

  </p>

</template>

<script>

export default {

  data(){

      return {

      texts:'这是子组件的数据,将有子组件操作触发传给父组件'

      }

  },

  methods:{

    target:function(){ //又子组件的事件触发 自定义事件childevent

      this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet

    }

  },

}

</script>

登录后复制

将两者情况对比,区别就在于$emit 自定义事件的触发是有父组件还是子组件去触发

第一种,是在子组件中定义一个click点击事件来触发自定义事件$emit,然后在父组件监听

第二种,是在父组件中第一一个click点击事件,在组件中通过refs获取实例方法来直接触发事件,然后在父组件中监听

3.兄弟组件之间的通信

 (1)、兄弟之间传递数据通过事件

 (2)、创建一个新Vue的实例,让各个兄弟共用同一个事件机制。(关键点)

 (3)、传递数据方,通过事件触发$emit(方法名,传递的数据)。

 (4)、接收数据方,在mounted()钩子函数(挂载实例)中 触发事件$on(方法名,callback(接收数据的数据)),此时callback函数中的this已经发生了改变,可以使用箭头函数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

//建立一个空的Vue实例,将通信事件挂载在该实例上

//emptyVue.js

import Vue from 'vue'

export default new Vue()

//兄弟组件a:childa.vue

<template>

  <p>

    <span>A组件->{{msg}}</span>

    <input type="button" value="把a组件数据传给b" @click ="send">

  </p>

</template>

<script>

import vmson from "./emptyVue"

export default {

  data(){

    return {

      msg:"我是a组件的数据"

    }

  },

  methods:{

    send:function(){

      vmson.$emit("aevent",this.msg)

    }

  }

}

</script>

//兄弟组件b:childb.vue

<template>

   <p>

    <span>b组件,a传的的数据为->{{msg}}</span>

  </p>

</template>

<script>

import vmson from "./emptyVue"

export default {

 data(){

    return {

      msg:""

    }

  },

  mounted(){

    vmson.$on("aevent",(val)=>{//监听事件aevent,回调函数要使用箭头函数;

      console.log(val);//打印结果:我是a组件的数据

      this.msg = val;

    })

  }

}

</script>

//父组件:parent.vue

<template>

  <p>

    <childa><childa>

    <childb></childb>

  </p>

</template>

<script>

import childa from "./childa";

import childb from "./childb";

export default {

  data(){

    return{

      msg:""

    }

  },

  components:{

    childa,

    childb

  },

}

</script>

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

angular 6中使用less步骤详解

jQuery实现无缝轮播与左右点击步骤详解

以上是vue中$emit 与$on父子兄弟组件操作详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何安装Win10旧版本组件DirectPlay 如何安装Win10旧版本组件DirectPlay Dec 28, 2023 pm 03:43 PM

不少用户在玩win10的的一些游戏的时候总是会遇到一些问题,比如说卡屏和花屏等等情况,这个时候我们是可以采用打开directplay这个功能来解决的,而且功能的操作方法也很简单。win10旧版组件directplay怎么安装1、在搜索框里面输入“控制面板”然后打开2、查看方式选择大图标3、找到“程序和功能”4、点击左侧的启用或关闭win功能5、选择旧版这里的勾选上就可以了

PyCharm使用教程:详细指引你运行操作 PyCharm使用教程:详细指引你运行操作 Feb 26, 2024 pm 05:51 PM

PyCharm是一款非常流行的Python集成开发环境(IDE),它提供了丰富的功能和工具,使得Python开发变得更加高效和便捷。本文将为大家介绍PyCharm的基本操作方法,并提供具体的代码示例,帮助读者快速入门并熟练操作该工具。1.下载和安装PyCharm首先,我们需要前往PyCharm官网(https://www.jetbrains.com/pyc

什么是 sudo,为什么它如此重要? 什么是 sudo,为什么它如此重要? Feb 21, 2024 pm 07:01 PM

sudo(超级用户执行)是Linux和Unix系统中的一个关键命令,允许普通用户以root权限运行特定命令。sudo的功能主要体现在以下几个方面:提供权限控制:sudo通过授权用户以临时方式获取超级用户权限,从而实现了对系统资源和敏感操作的严格控制。普通用户只能在需要时通过sudo获得临时的特权,而不需要一直以超级用户身份登录。提升安全性:通过使用sudo,可以避免在常规操作中使用root账户。使用root账户进行所有操作可能会导致意外的系统损坏,因为任何错误或不小心的操作都将具有完全的权限。而

Linux Deploy的操作步骤及注意事项 Linux Deploy的操作步骤及注意事项 Mar 14, 2024 pm 03:03 PM

LinuxDeploy的操作步骤及注意事项LinuxDeploy是一款强大的工具,可以帮助用户在Android设备上快速部署各种Linux发行版,让用户能够在移动设备上体验到完整的Linux系统。本文将详细介绍LinuxDeploy的操作步骤以及注意事项,同时提供具体的代码示例,帮助读者更好地使用这一工具。操作步骤:安装LinuxDeploy:首先在

win10开机密码忘记按F2怎么操作 win10开机密码忘记按F2怎么操作 Feb 28, 2024 am 08:31 AM

想必很多的用户家里都有那么几台不用的电脑,因为长时间不用完全忘记了开机密码,于是想要知道一下,忘记密码要怎么操作呢?那就一起来看看吧。win10开机密码忘记按F2怎么操作1、按下电脑的电源键,然后开机时按下F2(不同电脑品牌进入bios的按键也不同)。2、在bios界面中,找到security选项(不同品牌电脑的位置可能有所不同)。一般都在顶部的设置菜单中。3、然后找到SupervisorPassword选项并且点击。4、这时候用户就可以看到自己的密码了,同时找到旁边的Enabled切换为Dis

华为Mate60 Pro截屏操作步骤分享 华为Mate60 Pro截屏操作步骤分享 Mar 23, 2024 am 11:15 AM

随着智能手机的普及,截屏功能成为日常使用手机的必备技能之一。华为Mate60Pro作为华为公司的旗舰手机之一,其截屏功能自然也备受用户关注。今天,我们就来分享华为Mate60Pro手机的截屏操作步骤,让大家能够更加便捷地进行截屏操作。首先,华为Mate60Pro手机提供了多种截屏方式,可以根据个人习惯选择适合自己的方式进行操作。下面详细介绍几种常用的截

Angular组件及其显示属性:了解非block默认值 Angular组件及其显示属性:了解非block默认值 Mar 15, 2024 pm 04:51 PM

Angular框架中组件的默认显示行为不是块级元素。这种设计选择促进了组件样式的封装,并鼓励开发人员有意识地定义每个组件的显示方式。通过显式设置CSS属性 display,Angular组件的显示可以完全控制,从而实现所需的布局和响应能力。

如何打开win10旧版组件的设置 如何打开win10旧版组件的设置 Dec 22, 2023 am 08:45 AM

win10旧版组件是需要用户自己去设置里面打开的,因为很多的组件平时都是默认关闭的状态,首先我们需要进入到设置里面,操作很简单,跟着下面的步骤来就可以了win10旧版组件在哪里打开1、点击开始,然后点击“win系统”2、点击进入控制面板3、再点击下面的程序4、点击“启用或关闭win功能”5、在这里就可以选择你要的打开了

See all articles