vue2和vue3中的组件间通信知识点总结

vue2中组件间通信

在Vue2中,组件间的通信是构建复杂应用的关键。以下是一些常见的Vue2组件间通信方式,并附有详细说明和示例:

1. Props(父子组件通信)

Props是Vue中用于父子组件通信的一种机制。父组件通过属性(Props)将数据传递给子组件。

Vue2中的组件间通信方式多种多样,选择哪种方式取决于具体的应用场景和需求。在实际开发中,应根据组件间的关系和通信的复杂度来选择最合适的通信方式。

这种方式通常用于祖先组件向子孙组件传递数据或事件监听器

  • 示例
    <!-- 父组件 -->  
    <template>  <div>  <child-component :message="parentMessage"></child-component>  </div>  
    </template>  <script>  
    import ChildComponent from './ChildComponent.vue';  export default {  components: {  ChildComponent  },  data() {  return {  parentMessage: 'Hello from Parent'  };  }  
    };  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <p>{{ message }}</p>  </div>  
    </template>  <script>  
    export default {  props: ['message']  
    };  
    </script>

    2. $emit(子父组件通信)

    子组件通过$emit触发自定义事件,父组件监听并响应这些事件,从而实现子父组件间的通信。

  • 示例
    <!-- 子组件 -->  
    <template>  <button @click="sendMessage">Send Message to Parent</button>  
    </template>  <script>  
    export default {  methods: {  sendMessage() {  this.$emit('custom-event', 'Hello from Child');  }  }  
    };  
    </script>  <!-- 父组件 -->  
    <template>  <div>  <child-component @custom-event="handleCustomEvent"></child-component>  </div>  
    </template>  <script>  
    import ChildComponent from './ChildComponent.vue';  export default {  components: {  ChildComponent  },  methods: {  handleCustomEvent(message) {  console.log('Received message from child:', message);  }  }  
    };  
    </script>

    3. EventBus(兄弟组件通信)

    通过创建一个中央事件总线EventBus,兄弟组件可以通过emit触发自定义事件,并通过on监听这些事件,从而实现兄弟组件间的通信。

  • EventBus文件
    // EventBus.js  
    import Vue from 'vue';  
    export const EventBus = new Vue();
  • 兄弟组件1
    <template>  <button @click="sendMessage">Send Message to Brother</button>  
    </template>  <script>  
    import { EventBus } from './EventBus.js';  export default {  methods: {  sendMessage() {  EventBus.$emit('custom-event', 'Hello from Brother1');  }  }  
    };  
    </script>
  • 兄弟组件2
    <template>  <p>{{ message }}</p>  
    </template>  <script>  
    import { EventBus } from './EventBus.js';  export default {  data() {  return {  message: ''  };  },  created() {  EventBus.$on('custom-event', (message) => {  this.message = message;  });  }  
    };  
    </script>

    4. Vuex(全局状态管理)

    Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。使用Vuex可以实现任意组件之间的通信。

  • 安装Vuex
    npm install vuex --save
  • 创建Store文件
    // store/index.js  
    import Vue from 'vue';  
    import Vuex from 'vuex';  Vue.use(Vuex);  export default new Vuex.Store({  state: {  globalMessage: ''  },  mutations: {  setGlobalMessage(state, message) {  state.globalMessage = message;  }  }  
    });
  • 使用Vuex的组件
    <!-- 组件1 -->  
    <template>  <button @click="sendMessage">Send Message to Anywhere</button>  
    </template>  <script>  
    export default {  methods: {  sendMessage() {  this.$store.commit('setGlobalMessage', 'Hello from Vuex');  }  }  
    };  
    </script>  <!-- 组件2 -->  
    <template>  <p>{{ globalMessage }}</p>  
    </template>  <script>  
    export default {  computed: {  globalMessage() {  return this.$store.state.globalMessage;  }  }  
    };  
    </script>

    5. Provide/Inject(祖先与后代组件通信)

    Provide/Inject是Vue2.2.0+新增的API,用于祖先组件向其所有后代组件提供数据/方法,后代组件通过inject选项来接收。

  • 祖先组件
    <template>  <div>  <descendant-component></descendant-component>  </div>  
    </template>  <script>  
    import { provide } from 'vue';  
    import { globalMessage } from './symbols.js';  export default {  setup() {  provide(globalMessage, 'Hello from Ancestor');  }  
    };  
    </script>
  • 后代组件
    <template>  <div>  <p>{{ foo }}</p>  </div>  
    </template>  <script>  
    export default {  inject: ['foo']  
    };  
    </script>

    6. $refs

    refs是一个对象,持有注册过ref特性的所有DOM元素和组件实例。父组件可以通过refs主动获取子组件的实例,从而直接调用子组件的方法或访问子组件的数据。

    <!-- 父组件 -->  
    <template>  <div>  <child-component ref="child"></child-component>  </div>  
    </template>  <script>  
    import ChildComponent from './ChildComponent.vue';  export default {  components: {  ChildComponent  },  mounted() {  const child = this.$refs.child;  console.log(child.str); // 获取子组件的数据  child.fn('调用了子组件的方法'); // 调用子组件的方法  }  
    };  
    </script>  <!-- 子组件 -->  
    <template>  <input type="text" />  
    </template>  <script>  
    export default {  data() {  return {  str: '我是数据'  };  },  methods: {  fn(e) {  console.log(e);  }  }  
    };  
    </script>

    7. parent或root

    通过parent或root,组件可以访问其父组件或根组件的实例,从而进行通信。但这种方式通常不推荐使用,因为它破坏了组件的封装性,使组件间的依赖关系变得复杂。

    8. attrs与listeners

  • **attrs∗∗:包含了父级作用域中不作为prop被识别(且获取)的特性绑定(class和style除外)。当组件没有声明某个prop时,这个prop会作为一个特性(attribute)绑定到组件的根元素上,并可以通过attrs进行访问。
  • **listeners∗∗:包含了父级作用域中的v−on事件监听器。这些监听器可以在组件内部通过listeners进行访问,并可以绑定到组件内部的元素上。

vue3中组件间通信

在Vue3中,组件间的通信方式多种多样,以下是几种常见的通信方式及示例:

一、props(父组件向子组件传递数据)

  • 说明:父组件通过props属性将数据传递给子组件。在子组件中,可以使用defineProps来接收这些数据。
  • 示例
    <!-- 父组件 -->  
    <template>  <div>  <h1>我是父组件</h1>  <child :name="name" age="12"></child>  </div>  
    </template>  <script setup lang="ts">  
    import child from './child.vue'  
    import { ref } from 'vue'  
    const name = ref('父亲名字')  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <h1>我是子组件</h1>  <p>我收到了父组件的数据: {{ name }}</p>  <p>{{ props.age }}</p>  </div>  
    </template>  <script setup lang="ts">  
    const props = defineProps(["name", "age"]);  
    </script>

    二、自定义事件(子组件向父组件发送消息)

  • 说明:子组件通过$emit触发自定义事件,并传递数据给父组件。父组件通过监听这些事件来接收数据。
  • 示例
    <!-- 父组件 -->  
    <template>  <div>  <h1>我是父组件</h1>  <child @mimi="tingmimi"></child>  <p>我听到了子组件的秘密: {{ msg }}</p>  </div>  
    </template>  <script setup lang="ts">  
    import child from './child.vue'  
    import { ref } from 'vue'  
    let msg = ref('还没听到秘密')  
    const tingmimi = function(message: any) {  msg.value = message  
    }  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <h1>我是子组件</h1>  <button @click="saymimi">点我给父组件说我的秘密</button>  </div>  
    </template>  <script setup lang="ts">  
    let $emit = defineEmits(['mimi'])  
    const saymimi = function() {  $emit('mimi', '是邓紫棋的我的秘密啦')  
    }  
    </script>

    三、mitt全局事件总线(兄弟组件间通信)

  • 说明:使用mitt库创建一个全局事件总线,允许任意组件间进行通信。
  • 示例
    # 安装mitt  
    npm i mitt
    // 在utils文件创建mitt.ts文件  
    import mitt from 'mitt'  
    const $bus = mitt()  
    export default $bus
    <!-- 子组件1 -->  
    <template>  <div>  <h1>我是子组件1</h1>  <p>我收到了来自兄弟的信息: {{ message }}</p>  </div>  
    </template>  <script setup lang="ts">  
    import $bus from '../utils/mitt'  
    import { ref } from 'vue'  
    let message = ref('还不知道呢')  
    $bus.on('mimi', (msg: any) => {  message.value = msg  
    })  
    </script>  <!-- 子组件2 -->  
    <template>  <div>  <h1>我是子组件2</h1>  <button @click="sayborder">点我给兄弟发秘密</button>  </div>  
    </template>  <script setup lang="ts">  
    import $bus from '../utils/mitt'  
    const sayborder = function() {  $bus.emit('mimi', { mimi: "遗产全都给我了" })  
    }  
    </script>

    四、v-model(父子组件数据双向绑定)

  • 说明v-model可以用于父子组件间的数据双向绑定。在子组件中,需要定义propsemits来配合v-model的使用。
  • 示例
    <!-- 父组件 -->  
    <template>  <div>  <h1>我是父组件</h1>  <p>我的财产: {{ money1 }}</p>  <child v-model:money="money1"></child>  </div>  
    </template>  <script setup lang="ts">  
    import { ref } from 'vue'  
    import child from './child.vue'  
    let money1 = ref(122000)  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <h1>我是子组件</h1>  <input type="text" v-model="value.money">  <p>父亲的钱: {{ money }}</p>  <button @click="sayborder()">点我偷掉父亲的钱</button>  </div>  
    </template>  <script setup lang="ts">  
    const value = defineProps(['money'])  
    const $emit = defineEmits(['update:money'])  
    const sayborder = function() {  $emit('update:money', value.money - 200)  
    }  
    </script>

    五、useAttrs(获取组件的属性)

  • 说明useAttrs可以用于获取组件上未被props声明的属性。
  • 示例
    <!-- 父组件 -->  
    <template>  <div>  <h1>我是父组件</h1>  <child :money="money" data="extraData"></child>  </div>  
    </template>  <script setup lang="ts">  
    import { ref } from 'vue'  
    import child from './child.vue'  
    const money = ref(122000)  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <h1>我是子组件</h1>  <p>收到了父亲的财产: {{ money }}</p>  <p>额外数据: {{ extraData }}</p>  </div>  
    </template>  <script setup lang="ts">  
    import { useAttrs } from 'vue'  
    let attrs = useAttrs()  
    let { money, data: extraData } = attrs  
    </script>

    六、ref与$parent(父组件访问子组件实例,子组件访问父组件实例)

  • 说明:使用ref可以在父组件中获取子组件的实例,从而直接调用子组件的方法或访问其数据。同时,子组件可以通过$parent访问父组件的实例。
  • 示例(仅展示父组件访问子组件):
    <!-- 父组件 -->  
    <template>  <div>  <h1>我是父组件</h1>  <child ref="mychildref"></child>  <button @click="accessChild">访问子组件</button>  </div>  
    </template>  <script setup lang="ts">  
    import child from "./child.vue"  
    import { ref } from "vue"  
    const mychildref = ref(null)  
    const accessChild = () => {  console.log(mychildref.value.someChildMethod()) // 假设子组件有一个someChildMethod方法  
    }  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <h1>我是子组件</h1>  </div>  
    </template>  <script setup lang="ts">  
    const someChildMethod = () => {  return "我是子组件的方法"  
    }  
    defineExpose({  someChildMethod // 对外暴露方法,以便父组件访问  
    })  
    </script>

    七、Provide/Inject(跨层级组件通信)

  • 说明Provide/Inject是Vue3中新增的一种组件通信方式,用于实现跨层级的组件通信。祖先组件通过provide提供数据,后代组件通过inject获取数据。
  • 示例
    <!-- 祖先组件 -->  
    <template>  <div>  <h1>我是祖先组件</h1>  <parent></parent>  </div>  
    </template>  <script setup lang="ts">  
    import { provide } from 'vue'  
    import parent from './parent.vue'  
    provide('sharedData', '这是共享的数据')  
    </script>  <!-- 父组件 -->  
    <template>  <div>  <h1>我是父组件</h1>  <child></child>  </div>  
    </template>  <script setup lang="ts">  
    import child from './child.vue'  
    </script>  <!-- 子组件 -->  
    <template>  <div>  <h1>我是子组件

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

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

相关文章

社工字典生成工具 —— CeWL 使用手册

GitHub - digininja/CeWL: CeWL is a Custom Word List GeneratorCeWL is a Custom Word List Generator. Contribute to digininja/CeWL development by creating an account on GitHub.https://github.com/digininja/CeWL/ 0x01&#xff1a;CeWL 简介 CeWL&#xff08;Cust…

openmmlab实现图像超分辨率重构

文章目录 前言一、图像超分辨率重构简介二、mmmagic实现图像超分 前言 超分辨率重构技术&#xff0c;作为计算机视觉领域的一项重要研究课题&#xff0c;近年来受到了广泛关注。随着科技的飞速发展&#xff0c;人们对图像质量的要求越来越高&#xff0c;尤其是在智能手机、监控…

【算法】链表:24.两两交换链表中的节点

目录 1、题目链接 2、题目介绍 3、解法 4、代码 1、题目链接 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 引入伪头节点&#xff1a; 为了处理头节点可能被交换的情况&#xff0c;我们引入一个伪头节点&#xff08;dummy no…

AI助力农作物自动采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

快速生成单元测试

1. Squaretest插件 2. 依赖 <dependency><groupId>junit</groupId>

Mysql和Oracle使用差异和主观感受

这两种常用的关系型数据库有何差异&#xff1f; 支持和社区 MySQL&#xff1a;有一个活跃的开源社区&#xff0c;用户可以获取大量的文档和支持。 Oracle&#xff1a;提供了专业的技术支持&#xff0c;但通常需要额外的费用。 易用性 MySQL&#xff1a;通常被认为是更易于学…

新赚米渠道,天工AI之天工宝典!

新赚米渠道&#xff0c;天工AI之天工宝典&#xff01; 引言 随着人工智能和数字创作工具的发展&#xff0c;内容创作的门槛不断降低&#xff0c;为普通用户提供了更多的赚钱机会。在这样的背景下&#xff0c;天工AI应运而生&#xff0c;凭借其强大的创作能力和最新更新的“天…

JZ2440开发板——异常与中断

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、中断概念的引入与处理流程 1.1 中断概念的引入 这里有一个很形象的场景比喻&#xff1a;假设一位母亲在大厅里看书&#xff0c;婴儿在房间里睡觉&#xff0c;这位母亲怎样才能知道这个孩子睡醒了&a…

ESP32-C3实现GPIO输出高低电平

1. 定义 GPIO 管脚 首先&#xff0c;定义你将要使用的 GPIO 管脚号。 #define GPIO_OUTPUT_PIN 2 // 定义一个 GPIO 管脚作为输出2. 初始化 GPIO 在 setup() 函数中&#xff0c;配置该 GPIO 管脚为输出模式。 void setup() {pinMode(GPIO_OUTPUT_PIN, OUTPUT); // 设置 GPIO …

【MODIS处理工具】MRT(MODIS Reprojection Tool) 下载及安装

【MODIS处理工具】MRT下载及安装教程 MRT软件下载MRT软件使用参考1999年12月,中分辨率成像光谱仪MODIS搭载美国宇航局NASA对地观测系统EOS平台的Terra卫星发射到太空。2002年5月,第二个MODIS传感器搭载Aqua卫星发射。MODIS的主要任务是对地球陆地、海洋和大气进行连续的全面观…

《Linux从小白到高手》理论篇:Linux的系统环境管理

List item 值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下&#xff0c;如果你下载并安装了应用程序&#xff0c;很有可能在键入它的名称时出现“command not found”的提示…

【PPT工具】三维绘图神器ThreeD Tools插件安装及使用

【PPT工具】三维绘图神器ThreeD Tools插件安装及使用 1 ThreeD Tools插件安装及加载1.1 ThreeD Tools插件安装1.2 ThreeD Tools插件加载 2 ThreeD Tools插件使用绘制渐变箭头 参考 ThreeD Tools是一款Microsoft PowerPoint的第三方插件&#xff0c;是“只为设计”为“般若黑洞”…

代码与财富:程序员如何利用技术优势投资金融?

最近A股很火热啊&#xff0c;根据最新统计&#xff0c;超过70%的程序员表示对金融投资感兴趣&#xff0c;但只有不到20%的人真正了解如何利用他们的技术优势。今天&#xff0c;我们将打破这一局面。在数字时代&#xff0c;程序员不仅是代码的创造者&#xff0c;更是财富的探索者…

众智OA办公系统 Account/Login SQL注入漏洞复现

0x01 产品简介 众智OA办公系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台。它凭借先进的技术和人性化的设计理念,实现了信息的快速传递和自动化处理,帮助企业和机构实现信息化、自动化、智能化和标准化的办公管理。 0x02 漏洞概述 众智OA办公系统 Acc…

【C语言】使用结构体实现位段

文章目录 一、什么是位段二、位段的内存分配1.位段内存分配规则练习1练习2 三、位段的跨平台问题四、位段的应用五、位段使用的注意事项 一、什么是位段 在上一节中我们讲解了结构体&#xff0c;而位段的声明和结构是类似的&#xff0c;它们有两个不同之处&#xff0c;如下&…

【重学 MySQL】四十四、相关子查询

【重学 MySQL】四十四、相关子查询 相关子查询执行流程示例使用相关子查询进行过滤使用相关子查询进行存在性检查使用相关子查询进行计算 在 select&#xff0c;from&#xff0c;where&#xff0c;having&#xff0c;order by 中使用相关子查询举例SELECT 子句中使用相关子查询…

【C++】认识匿名对象

文章目录 目录 文章目录前言一、对匿名对象的解读二、匿名对象的对象类型三、匿名对象的使用总结 前言 在C中&#xff0c;匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数&#xff0c;并且不需要将结果存放进变量中。 匿名…

每日OJ题_牛客_AB13【模板】拓扑排序_C++_Java

目录 牛客_AB13【模板】拓扑排序 题目解析 C代码 Java代码 牛客_AB13【模板】拓扑排序 【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 给定一个包含nn个点mm条边的有向无环图&#xff0c;求出该图的拓扑序。若图的拓扑序不唯一&#xff0c;输出任意合法…

Matlab|基于遗传粒子群算法的无人机路径规划【遗传算法|基本粒子群|遗传粒子群三种方法对比】

目录 主要内容 模型研究 部分代码 结果一览 下载链接 主要内容 为了更高效地完成复杂未知环境下的无人机快速探索任务&#xff0c;很多智能算法被应用于无人机路径规划方面的研究&#xff0c;但是传统粒子群算法存在粒子更新思路单一、随机性受限、收敛速度慢…

【笔记】DDD领域驱动设计

同名读书笔记&#xff0c;对于一些自觉重要的点进行记录。 扩展资源&#xff1a;github.com/evancyz/ddd-learning UML中类图的一些基本知识 - jack_Meng - 博客园 最后的第四部分暂时没看 Part Two 模型驱动设计的构造块 Chapter 5 软件中所表示的模型 5.2 模式&#xff1a;…