最新要闻
- 当前热讯:成功展商要点——2023第十二届北京国际汽车制造业博览会
- 环球即时:传音Tecno Camon 20系列发布:五边形镜组极具辨识度
- 当前资讯!《斗罗大陆双神战双神》首个场景秀公开:虚幻5打造 画面逼真
- 这就很尴尬 男子高速电话指导女友开车 结果自己撞了
- 世界看点:4699元起 九号智能电动车小Q发布:新国标、能跑95km
- 一图看懂联发科旗舰新U天玑9200+:CPU/GPU性能提升10%、功耗更低了
- 环球看点!男童喉咙长菜花样肿块确诊感染HPV
- 2023年梅花金银兔纪念币价格(2023年05月10日)_世界快资讯
- 仅7999元!Redmi MAX 90英寸巨屏电视开售:百级分区、144Hz高刷 即时焦点
- 每日热议!亏电百公里油耗3.9升 比亚迪驱逐舰07申报:凯美瑞、雅阁瑟瑟发抖
- 保时捷718上新款 157.8万元起!真心无法抗拒 全球简讯
- 环球快看点丨悦达起亚被曝管理岗轮休 一休就一年!官方回应
- 中国电信在科技创新中加速释放消费活力 每日聚焦
- 黄道十二宫是什么意思?黄道十二宫是哪个文明首先提出的?
- 每日看点!98年浙大女学霸曾被视为格力接班人 孟羽童称靠别人永远不如靠自己
- 金锣玉米热狗香肠20袋到手19.9元:新鲜美味 当前短讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日消息!Vue2组件间通讯
Vue2组件间通讯
1、组件之间的关系
1.1、父子组件
假如在App组件中,引用了Student组件,那么我们就把App和Student两个组件的关系定义为父子,App是父组件,而被引用的Student是子组件。
1.2、兄弟组件
如果在App组件中,不仅引用了Student组件,又引用了School组件,那么School组件也是App的子组件。
(资料图)
既然School和Student都是App的子组件,那么School和Student就是兄弟组件。
1.3、爷孙组件
假如在Student组件中,引用了一个List组件,用于循环遍历学生的信息列表,那么List是Student的子组件。
而Student又是App的子组件,儿子的儿子是什么?坐过超市门口摇摇车的同学都知道,App是List的爷爷,List是App的孙子,那么App和List组件关系就是爷孙。
2、父子组件之间的通讯
什么是父子组件之间的通讯?就是传值,假如父组件有一个值要传给子组件,或者子组件有一个值要传给父组件,该怎么传?
2.1、子传父(绑定自定义事件)
第一种方式:自定义事件(使用@或v-on)
在父组件App.vue中定义一个自定义事件school,比如说:
<script> import School from "./components/School"; export default { name: "App", components: {School}, methods: { getSchoolName(name) { alert("我的子组件School给我传了一个学校名:" + name); } } }</script>
在子组件School.vue中去触发父组件定义的school事件:
学校名:{{ name }}
<script> export default { name: "School", data() { return { name: "test", } }, methods: { sendSchoolName() { // $emit触发School组件上的school事件 this.$emit("school", this.name); } } }</script>
第二种方式 自定义事件(使用ref)
父组件App.vue中,在生命周期钩子mouted中:
<script> import School from "./components/School"; export default { name: "App", components: {School}, methods: { getSchoolName(name) { alert("我的子组件School给我传了一个学校名:" + name); } }, mounted() { // 自定义事件 this.$refs.schoolComponent.$on("school", this.getSchoolName); // 比使用@或v-on的方式更加灵活,可以加条件判断,又或者使用$once自定义事件可以只触发一次 // this.$refs.schoolComponent.$once("school", this.getSchoolName); } }</script>
School.vue中的代码和上述一致。
2.2、子传父(解绑自定义事件)
解绑一个自定义事件
this.$off("school");
解绑多个自定义事件
this.$off(["school", "test"]);
解绑所有自定义事件
this.$off();
代码示例:
学校名:{{ name }}
<script>export default { name: "School", data() { return { name: "test", } }, methods: { sendSchoolName() { // 触发School组件上的school事件 this.$emit("school", this.name); // 触发School组件上的demo事件 this.$emit("demo"); }, unbind() { // this.$off("school"); // 解绑一个自定义事件 // this.$off(["school", "demo"]); // 解绑多个自定义事件 this.$off(); // 解绑所有的自定义事件 }, destroy() { this.$destroy(); // 销毁了当前组件的实例,销毁之后所有的School实例的自定义事件就全部不奏效了 } }}</script>
2.3、父传子(props)
通过props配置项,可以接受到外部过来的数据,通常用于父组件往子组件传递值。
传递数据
接收数据
// 第一种:只接收props: ["name"],// 第二种:限制类型props: { name: String},// 第三种:限制类型、必要性、指定默认值props: { name: { type: String, // 类型 required: true, // 必要性 // default: "张三", // 默认值,和required不可以同时使用,因为默认值是没有传值的时候默认值,都required了那肯定有值传过来 }}
注意:props中的值是只读的,无法直接修改,否则vue会发出警告。如果要修改props中传过来的值,那也要先存到data中再做修改。
代码示例:
父组件App.vue:
<script>import Student from "./components/Student.vue"export default { name: "App", components: { Student }}</script>
子组件Student.vue:
学生姓名:{{ name }}
学生年龄:{{ age }}
学生性别:{{ sex }}
<script>export default { name: "Student", data() { return { // 如果想修改props的值,得先放在data中,就不会报错 myAge: this.age } }, methods: { updateAge() { this.myAge = 100 } }, // props: ["name", "age", "sex"] // 简单接收(开发中这个写得多) // 接收的同时对数据进行类型限制 // props: { // name: String, // age: Number, // sex: String, // } // 接收的同时对数据进行类型限制 + 默认值的指定 + 必要值的限制 props: { name: { type: String, required: true, // 名字是必须的 }, age: { type: Number, default: 99, // age可传可不传,如果没传,默认值是99 }, sex: { type: String, required: true, } }}</script>
3、事件总线
如果有人看到这就会奇怪,怎么2中只讲了父子组件之间的通讯,那兄弟组件和爷孙组件该怎么通讯呢?难道兄弟和爷孙之间代沟太大,无法交流吗?
并非如此,这里要介绍一种可以适用于任意组件之间通讯的技术,兄弟和爷孙就可以利用这个技术进行通讯,这个技术叫做事件总线。
1、安装全局事件总线,在脚手架中main.js入口文件中进行全局安装$bus。
import Vue from "vue"import App from "./App.vue"Vue.config.productionTip = false// 创建Vue实例对象 --- vmnew Vue({ render: h => h(App), beforeCreate() { Vue.prototype.$bus = this; // 安装全局事件总线 },}).$mount("#app")
bus这个英文单词有公交车,也有总线的意思。顾名思义,公交车嘛,谁都可以上,都可以往上面存数据,取数据。
Vue.prototype.$bus = this,为什么这么写?
如果掌握了JS高级中的原型与原型链可以看看,否则可以跳过。
首先,Vue.prototype是Vue构造函数的原型对象,而上述代码中的new Vue({}),new出来的是Vue的实例对象,通常我们命名为vm。(Vue是构造函数,vm是Vue构造函数的实例对象)
众所周知,构造函数Vue的实例对象vm,是可以通过隐式原型链_proto_,访问到Vue.prototype(原型对象)上的属性和方法的,这就确保了vm可以访问到$bus上的数据。
其次,vm下面管理着很多组件,这些组件并不是Vue构造函数new出来的,而是VueComponent构造函数new出来的,通常命名为vc,vc有无数个,而vm只有一个,一人之下,管理着所有组件。如果不使用脚手架,就可以看得很清楚,如下代码示例:
组件化编程 <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script> Vue.config.productionTip = false; // 创建school组件 const school = Vue.extend({ // el:"#root" // 组件定义时一定不要写el template: ` 学校名:{{ schoolName }}
地址:{{ address }}
`, data() { return { schoolName: "test", address: "福建" } } }) // 创建student组件 const student = Vue.extend({ template: ` 学生名:{{ studentName }}
学生年龄:{{ age }}
`, data() { return { studentName: "jack", age: 18 } } }); // 创建vm new Vue({ el: "#root", // 注册组件(局部注册) components: { school, student } }) </script>
上述代码可以看出,vm只有一个,是new Vue出来的,而vm所管理的vc有多个,是通过Vue.extend这个API生成的,其实这个API内部就是帮我们做了new VueComponent。而VueComponent有一个重要的内置关系,就是:
- VueComponent.prototype._proto_===Vue.prototype
- VueComponent构造函数的原型对象的隐式原型链__proto__是指向Vue.prototype的,这也是为什么不直接new VueComponent的原因,就是要让Vue.extend这个API帮忙做这一步。
因此,既然vc实例对象,一样可以通过隐式原型链__proto__去访问到Vue原型对象。
至此,vm和vc都共享Vue.prototype上面的属性和方法,这也就解释了Vue.prototype.$bus = this的前半句,为什么要把$bus放到Vue.prototype上,就是为了让所有的组件都可以访问到$bus,这辆公交车。
而this是什么呢?自然是vm。
为什么$bus要等于vm?为了调用vm上面的自定义事件API,没错,事件总线的本质依旧是自定义事件,代码示例如下:
兄弟组件School和Student之间进行通讯:
School.vue(在$bus上面自定义或者发布一个hello事件,来收数据):
学校名:{{ name }}
<script>export default { name: "School", data() { return { name: "test", } }, mounted() { this.$bus.$on("hello", (data) => { console.log("我是School组件,我收到了数据", data); }); }, beforeDestroy() { // 如果School组件被销毁,就同时解绑$bus上面注册或发布的自定义事件,这一步很有必要 this.$bus.$off("hello"); }}</script>
Student.vue(触发$bus上面的hello事件,来传数据):
学生姓名:{{ name }}
学生性别:{{ sex }}
<script>export default { name: "Student", data() { return { name: "张三", sex: "男", } }, methods: { sendStudentName() { this.$bus.$emit("hello", this.name); } }}</script>
ok,以上就是兄弟组件通过事件总线进行数据通讯,爷孙组件甚至曾爷爷曾孙子都一样可以通过事件总线进行通讯。
可能会萌新会问一些无聊的问题,比如说School和Student为什么是兄弟,不是姐妹?亦或者它们之间谁是兄,谁是弟之类的无聊问题。
我的解答是,这只是一种好理解的说法,它们之间没有长幼关系,而姐妹,如果你喜欢也可以叫姐妹。
任意组件之间进行通讯,除了事件总线的方法,还可以通过安装一些第三方库来进来通讯,比如消息的订阅与发布库pubsub.js,有兴趣可以去了解一下,和事件总线很相似。
关键词:
-
每日快讯!【新华500】新华500指数(989001)10日收跌0.65%
新华500指数(989001)10日收盘跌0 65%,报4397 27点。指数盘中最高触及4415 96点,最低触及4381 64点,成
来源: 每日消息!Vue2组件间通讯
每日快讯!【新华500】新华500指数(989001)10日收跌0.65%
当前热讯:成功展商要点——2023第十二届北京国际汽车制造业博览会
环球即时:传音Tecno Camon 20系列发布:五边形镜组极具辨识度
当前资讯!《斗罗大陆双神战双神》首个场景秀公开:虚幻5打造 画面逼真
这就很尴尬 男子高速电话指导女友开车 结果自己撞了
世界看点:4699元起 九号智能电动车小Q发布:新国标、能跑95km
一图看懂联发科旗舰新U天玑9200+:CPU/GPU性能提升10%、功耗更低了
环球看点!男童喉咙长菜花样肿块确诊感染HPV
今日看点:89.关于类的定义抽象数据类型
全球观速讯丨Mac系统,Qt工程转xcode工程,打包pkg
大幅提升前端工作效率!Numeral.js数值格式化库来了!
无需代码绘制人工神经网络ANN模型结构图的方法
2023年梅花金银兔纪念币价格(2023年05月10日)_世界快资讯
仅7999元!Redmi MAX 90英寸巨屏电视开售:百级分区、144Hz高刷 即时焦点
每日热议!亏电百公里油耗3.9升 比亚迪驱逐舰07申报:凯美瑞、雅阁瑟瑟发抖
保时捷718上新款 157.8万元起!真心无法抗拒 全球简讯
环球快看点丨悦达起亚被曝管理岗轮休 一休就一年!官方回应
中国电信在科技创新中加速释放消费活力 每日聚焦
每日播报!利用Appuploader上架IPA步骤
环球热文:代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。第一章 数组part01
黄道十二宫是什么意思?黄道十二宫是哪个文明首先提出的?
每日看点!98年浙大女学霸曾被视为格力接班人 孟羽童称靠别人永远不如靠自己
金锣玉米热狗香肠20袋到手19.9元:新鲜美味 当前短讯
热讯:为什么这届年轻人基本不走亲戚了?互联网“断亲”情况加剧:专家释疑
【环球新视野】西渝高铁最新进展!200余户已签协议
双商最高的四大星座是什么?十二星座的月份表
神话Eric的妻子是谁?神话Eric个人介绍
2011年快乐女声有哪些评委?2011届快女排名前十名
消失日晖打一字是什么?猜字谜游戏题目及答案
台电平板怎么刷机?台电平板android版如何获取root?
会声会影x4激活步骤是什么?会声会影x4激活代码
华硕f83v笔记本电池充电时橙色充电灯不停闪烁怎么解决?华硕f83v笔记本参数
三星笔记本r467怎么进bios设置u盘启动?三星笔记本r467参数
Vue 前端开发团队风格指南(史上最全)
Linux ARM架构_安装JDK8-银河麒麟V10 Kylin Linux-焦点速递
PSP上哪个火影的游戏最好玩?PSP经典游戏有哪些?
商家广告鼓励偷男友钱喝奶茶被罚 热消息
环球通讯!苹果推出iPad版Final Cut Pro与Logic pro:1个月免费试用
国人秒懂内涵 如何辨别在美国的中国人:看车牌 环球今头条
吸、扫、拖三合一!米家免洗扫拖机器人2正式开售:1999元
深圳一男子举牌相亲 月薪6千要求女方1万2:被路人质疑后神回应 世界热门
史诗级尴尬!马斯克驾驶Cybertruck结果趴窝:在农田里陷车
2023年社保缴费基数怎么调整?什么时候重新申报?_环球新资讯
环球新资讯:2分钟快速上手流水线的创建与运行
当前视讯!接单日记(三)文本处理之词云生成
今日热门!台式电脑有线网络怎么连接_有线网络怎么连接
华为将发布双旗舰笔记本 MateBook新品颜值、性能将迎全面升级
世界热点!任天堂Switch卖不动了?销量下降22% 还要再苟一年
首发9999元 小米电视ES Pro 90寸开售:1000nits高亮度
今日观点!希思黎京东官方自营旗舰店开业 打造全新高端奢护体验
环球今日报丨支持双枪快充!比亚迪赵长江:腾势N7制动距离“遥遥领先”
焦点热讯:首个“三体”线下项目《三体 · 引力之外》有啥不一样?
焦点热议:杭州:西湖景区莲花绽放 花朵水面摇曳身姿
全球即时看!科大智能参设新能源发展公司 经营范围含电池销售
今日快讯:3D建模师用AI把自己变美少女 大叔成偶像
理想老板怒斥媒体人:隔壁吉利的高管羡慕坏了
多家挖呀挖公司注册成立:涉及零售业、服务业-每日资讯
环球滚动:50万级老板专属座驾 新一代国产奔驰E级亮相:车身、轴距全加长
249元 小米智能摄像机3开售:3K超清画质 支持双向语音通话
听说你还回忆我小说 听说你还回忆我
高效c语言1快速入门|焦点热闻
使用IDEA远程Debug调试(详细)|今日快讯
Echarts引入——绘制一个简单的图表|环球信息
世界热点评!豫能控股拟30亿布局新能源转型待考 煤炭涨价助推成本上升两年累亏逾40亿
头条:国内“老头乐一哥”!雷丁汽车申请破产:曾被经销商举报为诈骗
七彩虹发布新款隐星游戏本:RTX 4060首发5999元
【世界聚看点】百万级越野车!仰望U8申报信息公布:搭比亚迪最强2.0T发动机
全球聚焦:蔚来车主 绑架李斌?
比亚迪海豚最强对手来了!五菱宝骏云朵亮相:10万级大五座_热消息
今日视点:再动员再部署!龙湾全面推进这项工作!
VM虚拟机去虚拟化 玩游戏多开 过检测 tp vmp cf dnf
中信证券:下半年全球新能源汽车及储能有望延续高增长
AMD RDNA3甜点卡RX 7600到货了:价格不友好
热资讯!杭州女生地铁上隔空收到陌生信息 果粉热议常被此折磨:苹果回应给解决办法
你遇到没?苹果iPhone天气又崩了:用户吐槽不如安卓
爱犬跳车乱蹿 摩托车骑手高速路上抓狗:险象环生-视点
扫码才能点餐缴费?市消协劝喻商家:不得强制消费者关注公众号或用小程序_当前视讯
聚焦重点靶向发力 万亿税费红利加快释放 全球热文
环球观察:韩国最新民调:尹锡悦就职一周年,施政差评率60%
iOS 16.5 RC准正式版推送!iOS 16系统更新要绝唱了 每日速讯
华为Mate X3国际版亮相:系统是EMUI 13.1
学系统集成项目管理工程师(中项)系列19b_成本管理(下)_世界看点
新坎特伯利传说_关于新坎特伯利传说简介
捡漏上瘾!印度仍在抢购廉价俄油 全球油价将大涨价 环球关注
网友第一次装机遇到这些问题:好像当年的自己_每日热议
即时:滴滴一面:BigKey问题很致命,如何排查和处理?
“下沉式旅游”的信号,小城市接收到了吗? 焦点简讯
天天短讯!微信5个超实用隐藏功能 很多人都不会用!看完涨知识
最强高端旗舰手表 华为WATCH 4系列全球首发亮相:腕上健康管家
全球焦点!开发者称《王国之泪》主题是"手":让林克更具辨识度
代工厂搞出“雷军电动车”的老头乐一哥 死了:因为想好好做车
4.1Pb/s!中国创造光纤传输新纪录 世界观点
“基金公司”APP上买理财,血本无归?法院判了
欧冠半决赛晋级率:本菲卡居首,米兰、利物浦、尤文列前四|全球看点
指标到校和统招的区别_指标到校与统招的区别
谁抢到了五月天门票?网友吐槽:黄牛加价可随便买 最新资讯
国产SSD继续卷:梵想S690 2TB到手价499元 4800MB/s
拍照机皇再次易主 华为P60 Pro拿下DXO手机影像全球第一:156分-全球看点
美国布法罗枪击案一周年之际专家发声:消除种族歧视收效甚微 问题由来已久