前言

前期分享的测试开发系列!Vue 组件间通信方式汇总,总有一款适合你( 5分钟教程-附项目实战案例 )中介绍了 3 种组件间的通信方法,分别是:

  • props
  • 全局事件总线
  • 消息订阅与发布

今天给大家分享第 4 种组件间的通信方法:自定义事件

适用于:子组件给父组件传递数据

使用方法

例如:Student.vue组件是School.vue组件的子组件, 子组件Student.vue想要将学生姓名传递给父组件School.vue

第1种方法:ref标识

School.vue组件内容如下

<template><div><h1>学生姓名是:{{studentName}}</h1><!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第1种写法:使用ref) --><Student ref="student" @click.native="show"/></div>
</template>
<script>import Student from "./components/Student"export default {name:'School',components:{Student},data(){return {studentName:''}},methods: {getStudentName(name,...params){//使用name形参接收Student组件中传递过来的实参name,...params用于接收剩余的参数this.studentName = name}},mounted() {//先在methods中准备好getStudentName方法this.$refs.student.$on('studentName', this.getStudentName) //绑定自定义事件,指定回调函数为getStudentName}
}
</script>

Student.vue组件内容如下

<template><div><button @click="sendStudentName">发送学生名给School组件</button></div>
</template>
<script>export default {name:'Student',data() {return {name: '刘浩'}},methods: {sendStudentName(){//触发School组件实例身上的studentName事件,把学生名给School组件,再传递2个额外的参数:666,777this.$emit('studentName', this.name, 666, 777)}}}
</script>

第2种方法:v-on或@

School.vue组件内容如下

<template><div><h1>学生姓名是:{{studentName}}</h1><!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第2种写法:使用@或v-on) --><Student v-on:studentName="getStudentName"/><!-- 简写形式 --><!--<Student @studentName="getStudentName"/>--></div>
</template>
<script>import Student from "./components/Student"export default {name:'School',components:{Student},data(){return {studentName:''}},methods: {getStudentName(name,...params){//使用name形参接收Student组件中传递过来的实参name,...params用于接收剩余的参数this.studentName = name}}
}
</script>

Student.vue组件内容如下

<template><div><button @click="sendStudentName">发送学生名给School组件</button></div>
</template>
<script>export default {name:'Student',data() {return {name: '刘浩'}},methods: {sendStudentName(){//触发School组件实例身上的studentName事件,把学生名给School组件,再传递2个额外的参数:666,777this.$emit('studentName', this.name, 666, 777)}}}
</script>

项目实战

在 200行纯前端Vue代码!教你写一个专属TodoList【零基础友好】
项目实战案例中,使用的props组件间通信方式,这种通信方式有一些不足之处。

在测试开发系列!Vue 组件间通信方式汇总,总有一款适合你( 5分钟教程-附项目实战案例 )一文中有详细描述该种通信方式的不足之处,同时也介绍了其他 2 种组件间通信方式,不妨点开链接重新温习一下。

今天介绍的自定义事件的组件间通信方式的 2 种写法,可以很好的替换 todoList案例中所使用的通信方式。

父组件:App.vue组件内容如下

<template><div><ListFooter :todos="todos" @checkAllTodo="checkAllTodo" @clearAllTodo="clearAllTodo"/></div>
</template>
<script>import ListFooter from "./components/ListFooter"export default {name:'App',components:{ListFooter},data(){return {//由于todos是ListHeader组件和ListFooter组件都在使用,所以放在App中(状态提升)todos:JSON.parse(localStorage.getItem('todos')) || []}},methods: {//清除所有已经完成的todoclearAllTodo(){this.todos = this.todos.filter((todo)=>{return !todo.done})}}}
</script>

这里的App.vue组件就是父组件,ListFooter.vue组件是子组件,以clearAllTodo自定义事件为例。

使用的是第2种方法:v-on的简写形式@clearAllTodo=“clearAllTodo”,@后的clearAllTodo是自定义事件名称。

子组件ListFooter.vue在传递数据时只需要触发这个事件名称就可以传递数据给父组件App.vue=后的clearAllTodomethods 回调函数的名称。

子组件:ListFooter.vue组件内容如下

<template><div><button @click="clearAll">清除已完成任务</button></div>
</template>
<script>export default {name:'ListFooter',methods:{clearAll(){this.$emit('clearAllTodo') //使用自定义事件clearAllTodo实现---App组件中给绑定的自定义事件}}}
</script>

在子组件ListFooter.vue中使用$emit来触发父组件App.vue中自定义事件clearAllTodo的逻辑。

小结

  1. 自定义事件是一种组件间通信的方式,适用于:子组件传递数据给父组件

  2. 使用场景:A是父组件,B是子组件,B想给A传数据,需要在 A 中给 B 绑定自定义事件,事件的回调在 A 中定义。

  3. 绑定自定义事件:

    (1).第 1 种方式,在父组件App.vue中:

    <template><div><Student @studentName="sendStudentName"/> <!--或者使用以下非简写方式--><Student v-on:studentName="sendStudentName"/></div>
    </template>
    

    (2).第 2 种方式,在父组件App.vue中:

    <template><div><Student ref="student"/></div>
    </template>
    
    <script>import ListFooter from "./components/ListFooter"export default {name:'App',components:{ListFooter},data(){return {studentName:'刘浩'}},methods: {getStudentName(name,...params){this.studentName = name}},mounted(){this.$refs.student.$on('studentName',this.getStudentName)//提前准备好getStudentName回调方法}    }
    </script>
    
  4. 子组件中触发父组件中的自定义事件:
    this.$emit('studentName',传递的数据)

  5. 子组件中解绑自定义事件:
    this.$off('studentName')

  6. 组件上也可以绑定原生 DOM 事件,需要使用native修饰符。

欢迎关注 无量测试之道 公众号,回复领取资源

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

Vue前端组件化框架开发、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:无量测试之道

添加关注,让我们一起共同成长!

Vue 组件间通信方式:自定义事件相关推荐

  1. vue组件间通信方式

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用. vue组件间的几种通信方式:props.$emit/$on.vuex.$paraent ...

  2. Vue 组件间通信方式汇总,总有一款适合你( 附项目实战案例 )

    前言 前期分享的 200行纯前端Vue代码!教你写一个专属TodoList[零基础友好] 这个项目案例中使用的组件间通信方式是通过 事件绑定与props 接收来实现的,具体使用方式将在下面进行详细介绍 ...

  3. Vue组件间通信方式(详解)

    1. 组件之间的传值通信 组件之间通讯分为三种: 父传子.子传父.兄弟组件之间的通讯 (1)props/$emit 父传子:父组件通过import引入子组件,并注册,在子组件标签上添加要传递的属性,子 ...

  4. 【Vue.js】vue2组件间通信方式总结

    目录 一.props传参 1.父组件 ==> 子组件 2.子组件 ==> 父组件 二.组件的自定义事件 三.全局事件总线 四.消息订阅和发布 五.vuex 六.插槽 1.默认插槽 2.具名 ...

  5. Vue组件间通信之$emit/$on

    一.介绍 一个vue.js肯定是由多个组件组成的,而组件实例的作用域是相互独立的,即不同组件之间的数据无法简单的相互引用. 但是避免不了有时需要相互引用,比如一个父组件包含多个子组件,当父组件更改后需 ...

  6. vue组件间通信六种方式(完整版)

    前言   组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系:                如上图所示 ...

  7. Vue 组件间的通讯

    这一节我们一起看看 vue 中组件间的数据是如何传递的. 前面,我们已经初步建立了 vue 组件化的思想,知道如何创建组件.引入组件以及如何在组件里的一些功能.接下来,我们来学习怎么建立组件之间的连接 ...

  8. 【Day13】说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等)

    说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等) 一.父组件向子组件传值 二.子组件向父组件传值 三.兄弟组件传值 四.跨组件 一.父组件向子组件传值 1.1 prop ...

  9. Vue组件间的传值五大场景,你造吗?

    摘要:组件是 vue.js最强大的功能之一,这五个组件间传值场景你了解吗? 本文分享自华为云社区<你了解Vue组件间传值五大场景吗?>,作者:北极光之夜. . 父组件向子组件传值: 比如有 ...

最新文章

  1. 面向对象开发===继承特点
  2. 团队行为心理学读书笔记(8)绩效考核背后的行为心理学
  3. 睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
  4. linux运行时命令找不到,linux - 在运行Bash脚本时找不到命令,但是在直接运行命令时有效 - 堆栈内存溢出...
  5. html jade文件,Jade模板
  6. 筛选列_Excel办公实操,两大办公技能,复杂数据进行筛选,一看就会
  7. Python批量爬取名字中带有中文的pdf文件
  8. 【Linux】grep命令
  9. 【优化部署】 基于matlab遗传算法求解移动传感器部署优化问题【含Matlab源码 1197期】
  10. 伍斯特理工学院计算机科学硕士,美国伍斯特理工学院数据科学硕士录取
  11. Sympy符号计算(使用python求导,解方程组)
  12. 未来5年到底是做什么生意最好?
  13. 三星 android 模拟器下载地址,GalaxyOfWar电脑版下载 安卓模拟器图文安装教程
  14. 什么是字节码?采用字节码的最大好处是什么?
  15. Spring Cloud自定义Hystrix请求命令 1
  16. Verilog HDL高级数字设计 从零学习(一)
  17. 基于Flex的在线协作平台
  18. k线图入门与技巧:浪波理论与K线形态
  19. i34000m 4g内存 PHP,4000不到i3-8100四核独显傲腾内存配置推荐 颜值不错! (全文)
  20. MSP430G2433IPW28R 混合信号微处理器 封装:TSSOP28

热门文章

  1. 如何恢复手机通话记录?教你快速恢复
  2. 帝国导航高亮显示(只支持一级栏目,灵动标签)
  3. app下载 - app版本更新 (实测可行版)
  4. 未能加载文件或程序集“System.Net.Http, Version=4.2.0.0,。。。”或它的某一个依赖项
  5. Windows微信备份文件解密
  6. 绕cdn,求真实ip
  7. 简单数学--排列之全排错
  8. 一文带你了解android的root原理
  9. MNIST机器学习入门(一)
  10. expression must have pointer-to-class type but it has type