10 【组件编码流程 组件自定义事件 全局事件总线】

1.组件编码流程

  1. 组件化编码流程:

    ​ (1).拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。

    ​ (2).实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:

    ​ 1).一个组件在用:放在组件自身即可。

    ​ 2). 一些组件在用:放在他们共同的父组件上(状态提升)。

    ​ (3).实现交互:从绑定事件开始。

  2. props适用于:

    ​ (1).父组件 ==> 子组件 通信

    ​ (2).子组件 ==> 父组件 通信(要求父先给子一个函数)

  3. 使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!

  4. props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。

2.组件自定义事件

组件自定义事件是一种组件间通信的方式,适用于:子组件 ===> 父组件

使用场景

A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

2.1绑定自定义事件

第一种方式,在父组件中:<Demo @atguigu="test"/><Demo v-on:atguigu="test"/>

具体代码

App.vue

<template><div class="app"><!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第一种写法,使用@或v-on) --><Student @atguigu="getStudentName"/> </div>
</template><script>import Student from './components/Student'export default {name:'App',components:{Student},data() {return {msg:'你好啊!',studentName:''}},methods: {getStudentName(name,...params){console.log('App收到了学生名:',name,params)this.studentName = name}}}
</script><style scoped>.app{background-color: gray;padding: 5px;}
</style>

Student.vue

<template><div class="student"><button @click="sendStudentlName">把学生名给App</button></div>
</template><script>export default {name:'Student',data() {return {name:'张三',}},methods: {sendStudentlName(){//触发Student组件实例身上的atguigu事件this.$emit('atguigu',this.name,666,888,900)}},}
</script><style lang="less" scoped>.student{background-color: pink;padding: 5px;margin-top: 30px;}
</style>

第二种方式,在父组件中:

使用 this. r e f s . x x x . refs.xxx. refs.xxx.on() 这样写起来更灵活,比如可以加定时器啥的。

具体代码

App.vue

<template><div class="app"><!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第二种写法,使用ref) --><Student ref="student"/></div>
</template><script>import Student from './components/Student'export default {name:'App',components:{Student},data() {return {studentName:''}},methods: {getStudentName(name,...params){console.log('App收到了学生名:',name,params)this.studentName = name},},mounted() {this.$refs.student.$on('atguigu',this.getStudentName) //绑定自定义事件// this.$refs.student.$once('atguigu',this.getStudentName) //绑定自定义事件(一次性)},}
</script><style scoped>.app{background-color: gray;padding: 5px;}
</style>

Student.vue

<template><div class="student"><button @click="sendStudentlName">把学生名给App</button></div>
</template><script>export default {name:'Student',data() {return {name:'张三',}},methods: {sendStudentlName(){//触发Student组件实例身上的atguigu事件this.$emit('atguigu',this.name,666,888,900)}},}
</script><style lang="less" scoped>.student{background-color: pink;padding: 5px;margin-top: 30px;}
</style>

若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

触发自定义事件:this.$emit('atguigu',数据)

使用 this.$emit() 就可以子组件向父组件传数据

注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

2.2解绑自定义事件

this.$off('atguigu')

代码

this.$off('atguigu') //解绑一个自定义事件
// this.$off(['atguigu','demo']) //解绑多个自定义事件
// this.$off() //解绑所有的自定义事件

2.3组件使用原生事件

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

如果不用.native修饰符就会被当成自定义事件

<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第二种写法,使用ref) --><Event1 @click.native="handler1"></Event1>

1:原生DOM—button可以绑定系统事件----click单击事件等等

2:组件标签— event1可以绑定系统事件(不起作用,因为属于自定义事件)----native(可以把自定义事件变为原生DOM事件)

利用native触发—原理是事件委派

views/Communication/EventTest/Event1.vue中:

他的结构是这样的,但是我们在页面中,不管是点击Event1组件,还是其他内容,都可以触发打印,那是因为当前原生DOMclick事件,其实是给子组件的根节点div绑定了点击事件----利用事件委派,所以里面的h2和span也是可以触发打印的

image-20220720154327319

注意:给原生DOM绑定自定义事件没有任何意义的,因为没有办法触发$emit函数

一般是给组件绑定自定义事件在结合 o n , on, on,emit使用

2.4自定义组件中的$event

一般子组件传给父组件的值在methods对象中的函数接收,然而有时想从当前组件传些数据,但是这样就无法接收子组件传来的数据了

这时可以使用$event

子组件 传值
export default {methods: {customEvent() {this.$emit( custom-event ,  value )}}
}父组件 
接收自定义事件
<template><div><my-item v-for="(item, index) in list" @custom-event="customEvent(index, $event)"></my-list></div>
</template>接收$event
export default {methods: {//e就是接收过来的$event 现在他就是子组件传过来的值 不再是 对象事件 customEvent(index, e) {console.log(e) //  some value}}
}

3.全局事件总线

一种可以在任意组件间通信的方式,本质上就是一个对象,它必须满足以下条件

  1. 所有的组件对象都必须能看见他
  2. 这个对象必须能够使用 o n on onemit$off方法去绑定、触发和解绑事件

使用步骤

  1. 一种组件间通信的方式,适用于任意组件间通信。

  2. 安装全局事件总线:

    new Vue({......beforeCreate() {Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm},......
    }) 
    
  3. 使用事件总线:

    1. 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。

      methods(){demo(data){......}
      }
      ......
      mounted() {this.$bus.$on('xxxx',this.demo)
      }
      
    2. 提供数据:this.$bus.$emit('xxxx',数据)

  4. 最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。

    因为销毁的时候只会把组件销毁,不会把$bus上的销毁,下车要把东西带走。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353091.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

QQ互联地址 中注册的QQ开发者 在哪里提交审核?

QQ互联地址&#xff1a;https://connect.qq.com 废话不说&#xff0c;直接上图&#xff1a; 有时点击后没反应&#xff0c;耐心 多试几次&#xff01; 然后 就会看到 提交审核的表单了&#xff0c; 有没发现 这个提交审核的 链接藏的有点深&#xff01;&#xff01; 哈哈哈&am…

QQ小程序打开指定QQ群

官方提供了接口&#xff1a; <view class"footer"><button open-type "openGroupProfile" class"footer-tips" group-id"620033746">v1.0 by&#xff1a;IWH <text>加群玩&#xff01;</text></button&g…

打开图片链接直接打开QQ对话框

<a href"tencent://message/?uin7530****&SiteQQ交谈&Menuyes" target"blank"> <img border"0" src"http://wpa.qq.com/pa?p1:7530*****:7" alt"有事Q我吧" width"71" height"2…

QQ的分享

使用的sdk版本&#xff1a; V2.2.2&#xff08;发布日期&#xff1a;2014.3.17&#xff09; 弱弱的提醒下&#xff1a; 1.配置清单等环境搭建&#xff0c;这里就不多说了&#xff0c;可以去看看我的另外一篇博客&#xff0c;QQ的第三方登录&#xff0c;那里有介绍。 2.这里集…

QQ圈子:从哪里来,到哪里去

2019独角兽企业重金招聘Python工程师标准>>> 摆脱顿巴数的魔咒 社 交是人类的一个最基本的需求。但是&#xff0c;自然给我们人类的大脑&#xff0c;只能让我们维系150-200个左右的好友。超出这个范围&#xff0c;就会有好友慢慢地被淡忘。很多社会 群体的平均大小是…

html 打开腾讯qq,qq软件管理器 QQ应用管理器里面的腾讯软件打不开

手机QQ中的消息管理器在哪里 打开的qq软件主界面&#xff0c;点击左下角的“主菜单”按钮。 在打开的qq主菜单中&#xff0c;点击“设置”菜单项。 手机版qq怎么进消息管理器QQ右下角...有一个查找。 查找的左边,有一个小喇叭. 那个就是信息管理器。 腾讯qq上的应用管理器在哪 …

打开qq聊天界面的url

2019独角兽企业重金招聘Python工程师标准>>> 打开qq聊天界面的url 北极熊爱企鹅 10:43:39 NSString *open_URL "mqq://im/chat?chat_typewpa&uin501863587&version1&src_typeweb"; 转载于:https://my.oschina.net/LiuChongYang/blog/51829…

如何创建圈子

首先您需要登录您在CSDN Blog的个人管理后台,点击“圈子”.如图所示: 点击"创建一个新的圈子" 输入名称和标题&#xff08;名称将是URL的一部分&#xff0c;例如experts就是 http://blog.csdn.net/group/experts/的名称&#xff1b;而“CSDN专家群”则是标题&#x…

Numpy---创建多维数组、创建正态分布、创建均匀分布

1. 创建一个随机整数的多维数组 np.random.randint(low, highNone, sizeNone, dtypel) 参数说明: low : 最小值 highNone: 最大值 highNone时&#xff0c;生成的数值在【0, low&#xff09;区间内 如果使用high这个值&#xff0c;则生成的数值在【low, high&#xff09;区…

扩容系统盘【centos-root】

问题描述&#xff1a; 磁盘空间有42G&#xff0c;但是系统盘只有6G。 问题抛出&#xff1a;&#xff08;P2原本只有7G&#xff0c;其中有30G错误分配到nvmeOn1p2了&#xff09;p2的30G空间怎么合理分配给系统盘? &#xff08;执行&#xff1a; sudo growpart /dev/nvme0n1 …

华为od机试题目回顾

今天去做了华为机试&#xff0c;两道一星题&#xff0c;一道二星题。 一星题 1&#xff1a; 题目主要大意&#xff1a; 输入一串字符串&#xff0c;里面可能包含有(x,y)的坐标。 0<x<1000&#xff0c;0<y<1000&#xff0c;类似(01,1)、(1,01)、(0,100)的都是非法坐…

小米耳机怎么连接手机(实用方法)

今天来教教大家一个手机实用小技巧。就是手机怎么与小米蓝牙耳机配对连接。大家可以了解一下。 首先打开手机。进入设置。点击蓝牙进入。打开蓝牙开关。拿出蓝牙耳机。在蓝牙耳机的开关键上长按10秒左右。让耳机处于配对状态。点击进行小米蓝牙耳机连接。允许蓝牙耳机访问通讯…

【HTML-5】小米耳机产品模块

1. 以下为效果图 2.以下为源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

入手评测 小米降噪耳机 Pro怎么样

小米智能生活 官微宣布&#xff0c;年度旗舰小米降噪耳机 Pro 将于 5 月 13 日发布。小米降噪耳机 Pro怎么样这些点很重要看过你就懂了http://www.adiannao.cn/1 官方称&#xff0c;小米降噪耳机 Pro 采用了蕴涵“生命感”的弧线设计&#xff0c;每个角度都打磨得恰到好处&…

什么牌子的耳机好?国产TWS耳机推荐

随着越来越多的手机取消3.8mm耳机接口&#xff0c;TWS耳机便成为了更多用户的选择。现如今&#xff0c;随处可见的都是TWS耳机&#xff0c;在这多样化的蓝牙耳机市场&#xff0c;选择更多、更困难。下面&#xff0c;我来推荐几款好用的国产TWS耳机&#xff0c;一起来看看吧。 …

小米手机用什么蓝牙耳机好?高颜值游戏专属蓝牙耳机推荐

蓝牙耳机发展到现在&#xff0c;无论是从外观还是内置上&#xff0c;都有了很大的优化。人们对于耳机的要求也不单是为了听&#xff0c;更多的是注重耳机的外观&#xff0c;以及从自身的需求出发寻注重耳机的配置。当然&#xff0c;一副高颜值的耳机外观更能引人注目&#xff0…

300元的蓝牙耳机什么牌子好?300内无线蓝牙耳机推荐

感受过无线的自在舒适后&#xff0c;越来越多的小伙伴爱上了蓝牙耳机白天出街更潇洒&#xff0c;目前市面上蓝牙耳机琳琅满目可选择性较多价格从几十、几百元到数千元不等然而蓝牙耳机的安全性、舒适性如何&#xff1f;连接稳吗&#xff1f;下面整理了几款300元价位的耳机分享给…

小米air2se耳机只有一边有声音怎么办_几款两百元以内的耳机使用体验

2020-10-10 更新 小米Air2 SE 推荐指数&#xff1a;★★★★ 这款耳机同样体现了小米产品高性价比的特点&#xff0c;是一款非常实用的耳机&#xff0c;看使用频率就能知道这一点&#xff0c;这是我目前使用频率最高的耳机了&#xff0c;我的其他耳机要么有底噪&#xff0c;要么…

小米活塞耳机的背后——1MORE

多米音乐日前发布一款耳机产品——多米晶饰。这款耳机在外观上首次尝试添加了水晶&#xff0c;是一款专为女性用户打造的时尚耳机&#xff0c;目前已正式上架多米音乐、1MORE官网开始销售&#xff0c;而这款耳机从概念到设计到生产都来源于1MORE。 提到1MORE&#xff0c;可能会…