【Vue】组件间通信的7种方法(全)

目录

组件之前的通信方法

1. props/$emit

2.parent/children

3.ref

4.v-model

5.sync

6.attrs,attrs,attrs,listeners

7.provide/inject

7.eventBus


组件之前的通信方法

1. props/$emit

父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可以动态传递(一个表达式,一个对象或者布尔值等)父组件属性绑定 子组件用props接收

子改父 emit子组件的内部通过emit 子组件的内部通过emit子组件的内部通过emit去触发这个事件 同时也可以传参过去 v-on去传递事件是写在子组件的标签身边的,然后回调函数是写在父组件的methods身上的

//父组件
<template><div><child :msg="msg"  @changeMsg="changeMsg"></child><p>{{msg}}</p></div>
</template><script>
import child from "../components/Child";
export default {data() {return {msg: "hello"};},components: { child },methods:{changeMsg(value){this.msg=value}}
};
</script>// 这是子组件
<template><div><div @click="change">改变父组件的{{msg}}</div></div>
</template><script>
export default {props: ["msg"],methods:{change(){this.$emit("changeMsg",123)}}
};
</script>

 

2.parent/children

$parent 子组件可以获取到父组件身上的属性以及方法,但是一定要注意,如果说这个组件的父组件不止一个的话 那么容易发生报错

children父组件拿到自己身上的子组件的属性已经方法,如果身上的子组件不止一个的话打印this.children 父组件拿到自己身上的子组件的属性已经方法,如果身上的子组件不止一个的话 打印this.children父组件拿到自己身上的子组件的属性已经方法,如果身上的子组件不止一个的话打印this.children的时候会以数组的形式展示出来

3.ref

父组件想要拿到子组件身上的数据 还可以给子组件写上ref="名字" 然后在父组件身上 this.$ref.名字就可以拿到子组件 身上的方法已经数据都可以获取到

4.v-model

v-model:将数据传递下去的同时 子组件可以修改父组件提供过来的数据(emit方法)


// 这是父组件
<template><div><child v-model="msg"></child><p>{{msg}}</p></div>
</template><script>
import child from "../components/Child";
export default {data() {return {msg: "hello"};},components: { child }
};
</script>
// 这是子组件
<template><div><input :value="value" @input="$emit('input',$event.target.value)"></div>
</template><script>
export default {props: ["value"]
};
</script>

 

5.sync

sync:将数据传递下去的同时 允许子组件可以修改数据

// 父组件<template><div>{{num}}<child-a :count.sync="num" /></div>
</template><script>
import childA from "../components/ChildA";
export default {data() {return {num: 0};},components: { childA }
};
</script>// 子组件
<template><div><div @click="handleAdd">ADD</div></div>
</template><script>
export default {data() {return {counter: this.count};},props: ["count"],methods: {handleAdd() {this.$emit("update:count", ++this.counter);}}
};
</script>

 

6.attrs,attrs,attrs,listeners

attrs包含的是父组件不被prop所识别的特性(📢:inheritAttrs为true属性才会渲染false时属性不会被渲染)可以通过v−bind="attrs 包含的是父组件不被prop所识别的特性 (📢:inheritAttrs为true 属性才会渲染 false时 属性不会被渲染) 可以通过v-bind="attrs包含的是父组件不被prop所识别的特性(📢:inheritAttrs为true属性才会渲染false时属性不会被渲染)可以通过v−bind="attrs"传给内部的组件 listeners包含父组件啊种v−on事件监听器通过v−on="listeners 包含父组件啊种v-on事件监听器 通过v-on="listeners包含父组件啊种v−on事件监听器通过v−on="listeners" 传给内部的足迹爱

<template><div><!-- 父组件 --><h1>{{ count }}</h1><son:msg="msg":foo="foo":boo="boo":coo="coo":doo="doo"title="前端工匠"@click.native="handleClick"v-on:focus="handleFocus"/></div>
</template>
<script>
import son from "./son.vue";
export default {name: "FatherVue",components: { son },data() {return {msg: "父组件的msg",foo: "Javascript",boo: "Html",coo: "CSS",doo: "Vue",};},computed: {count() {return this.$children[0] && this.$children[0].count;},},mounted() {console.log(this.$children); // [子组件1, 子组件2,......]},methods: {handleClick() {console.log("handleClick");},handleFocus() {console.log("handleFocus");},},
};
</script><!-- 子组件 son.vue -->
<template><div>{{ msg }}<p>father 父组件的$attrs: {{ $attrs }}</p><button @click="handleClick">click</button><smallson v-bind="$attrs"></smallson></div>
</template><script>
import smallson from "./smallson.vue";
export default {name: "FuSon",components: { smallson },inheritAttrs: true, // 可以关闭自动挂载到组件根元素上的没有在props声明的属性computed: {msg() {return this.$parent.msg;},},data() {return {count: "我是子组件的count",};},methods: {handleClick() {console.log(this.$listeners);},},
};
</script><!-- smallson 组件 -->
<template><div><h1>smallson</h1>{{ $attrs }}</div>
</template><script>
export default {name: "SmallSon",inheritAttrs: false,
};
</script>

 

7.provide/inject

provide 提供变量 inject 注入变量

📢:

  1. 不论层级多深 只要调用了inject那么久可以注入provide的变量
  2. provide提供的数据在父组件中假设发生了变化 默认后辈的组件是不会响应式变化的 但是如果给的数据是this的数据的话 那么就是响应式的书
<template><div id="app"><myInject></myInject></div>
</template><script>
import myInject from "./components/zujiantongxin/inject.vue";
export default {name: "App",provide: {for: "provide", },// provide() {//   return {//     baba: this,//     msg: this.msg,//   };// }, 这个时候的数据就可以做到响应式的了 给的就是this的数据 给的就是响应式的数据 就可以做到响应式components: {myInject,},
};
</script><template><div><h2>inject 组件</h2><h1>{{ for1 }}</h1></div>
</template><script>
export default {name: "myInject",data() {return {for1: this.for,//这一步可以省略的};},inject: ["for"],mounted() {console.log(this.for);},
};
</script>

 

7.eventBus

EventBus 本质上就是一个vue实例对象,它可以实现兄弟组件之前的通信,首先在A组件中设置EventBus.on自定义事件名称以及回调函数,然后B组件就是通过eventbus.on自定义事件名称以及回调函数,然后B组件就是通过eventbus.on自定义事件名称以及回调函数,然后B组件就是通过eventbus.emit去触发那个自定义事件,将数据传递给A组件

Eventbus的原理实际上就是发布订阅的模式
发布订阅模式 :其实就是一种对象间一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都将得到状态改变的通知

vue中常见的发布订阅就是emitemit emiton

redux中常见的就是subscribe

// eventBus.js
import Vue from "vue";
export default new Vue();<template><!-- comA子组件 --><div><h1>{{ msg }}</h1></div>
</template>
<script>
import eventBus from "./eventBus";
export default {name: "面试ComA",data() {return {msg: "",};},mounted() {eventBus.$on("message", (val) => {this.msg = val;});},
};
</script><template><div><button @click="sendMsg">click 点击 想 COMA 发消息</button></div>
</template>
<script>
import eventBus from "./eventBus";
export default {name: "面试ComB",data() {return {};},methods: {sendMsg() {eventBus.$emit("message", "我是来自comB的数据");},},
};
</script><template><div id="app"><comA></comA><comB></comB></div>
</template><script>
import comA from "@/components/zujiantongxin/comA.vue";
import comB from "@/components/zujiantongxin/comB.vue";
export default {name: "App",components: {comA,comB,},
};
</script>

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端必备】深入详解Vue2/Vue3 diff算法实现思路

在做diff算法之前有个基本逻辑要明白&#xff0c;Vue的diff算法是同层比较&#xff0c;不会跨层比较&#xff0c;时间复杂度为O(N)。 主要使用首尾比较法&#xff08;头-头&#xff0c;头-尾&#xff0c;尾-头&#xff0c;尾-尾&#xff09;。Vue2与Vue3的diff算法主要区别是处…

查看自己电脑是arm还是x64(x86);linux操作系统识别

1、查看自己电脑是arm还是x64&#xff08;x86&#xff09; linux 参考&#xff1a; https://liuweiqing.blog.csdn.net/article/details/131783851 uname -a如果输出是 x86_64&#xff0c;那么你的系统是 64 位的 x86 架构&#xff08;通常我们称之为 x64&#xff09;。如果…

Java八大常用排序算法

1冒泡排序 对于冒泡排序相信我们都比较熟悉了&#xff0c;其核心思想就是相邻元素两两比较&#xff0c;把较大的元素放到后面&#xff0c;在一轮比较完成之后&#xff0c;最大的元素就位于最后一个位置了&#xff0c;就好像是气泡&#xff0c;慢慢的浮出了水面一样 Jave 实现 …

编曲是怎么编出来的 编曲软件哪个好用 编曲是干嘛的 编曲教学入门零基础 编曲制作 编曲和作曲什么区别 flstudio下载

编曲想必是许多音乐爱好者们的一大追求&#xff0c;能够自己编写出一首歌曲&#xff0c;代表着我们无论是从基本功还是创造力都达到了一定的水平。不过对于初学者来说&#xff0c;编曲还是比较复杂的&#xff0c;今天我们就来聊一聊编曲是怎么编出来的&#xff0c;编曲软件哪个…

「实用分享」用界面组件Telerik UI for Blazor增强你的财务图表!

Telerik UI for Blazor拥有110个原生的、易于定制的Blazor UI组件和高性能网格组件&#xff0c;能节约一半的时间开发全新的Blazor应用程序并使传统web项目现代化&#xff0c;其中囊括了设计和生成工具等。Telerik UI for Blazor控件提供的控件&#xff0c;可轻松满足应用程序对…

Cambalache in Ubuntu

文章目录 前言apt install flatpak这很ok快捷后记 前言 gtkmm4相比gtkmm3有很多改革, 代码也干净了许多, 但在windows上开发 有ui设计器那自然方便很多, 但glade又不支持gtkmm4, windows上装Cambalache很是困难. 各种问题都找不到答案.于是 我用VMware虚拟机Ubuntu20.xx安装Ca…

2024年高压电工证考试题库及高压电工试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工证考试题库及高压电工试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的高压…

从源代码看Chrome 版本号

一直以来都是用Chrome 浏览器&#xff0c;但是看到Chrome 点分4 组数据的表达方式&#xff0c;总是感觉怪怪的&#xff0c;遂深入源代码了解她的版本号具体表示的内容 chrome 浏览器中显示的版本号 源代码中的版本号标识 版本号文件位于 chrome/VERSION &#xff0c; 看到源代…

三种pdf转ppt方法?学会这几招轻松搞定转换

三种pdf转ppt方法&#xff1f;在当今的工作和生活中&#xff0c;PDF和PPT这两种文件格式常常会让我们感到困扰。有时候我们需要将PDF文件转换成PPT格式&#xff0c;以便更好地进行演示或工作汇报。但是&#xff0c;如何快速、准确地完成这项任务呢&#xff1f;本文将为你揭秘三…

【深入浅出Java性能调优】「底层技术原理体系」详细分析探索Java服务器性能监控Metrics框架的实现原理分析(Dropwizard度量基础案例指南)

深入探索Java服务器性能监控Metrics框架的实现原理分析 前提介绍Dropwizard MetricsDropwizard的特点Dropwizard的开发案例需要引入Maven依赖常用度量类型Meter(每秒请求数为单位测量请求率)定义度量核心MetricRegistry构建对应的Meter指标对象请求标记采样业务方法控制报告器…

计算机设计大赛 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

时间复杂度为 O(n) 的排序算法

大家好&#xff0c;我是 方圆。本文介绍线性排序&#xff0c;即时间复杂度为 O(n) 的排序算法&#xff0c;包括桶排序&#xff0c;计数排序和基数排序&#xff0c;它们都不是基于比较的排序算法&#xff0c;大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…