vue的 props 与 $emit 以及 provide 与 inject 的 组件之间的传值对比
好的,下面是 props 与 $emit 以及 provide 与 inject 的对比:
1. props 与 $emit
-
props:父组件通过props向子组件传递数据,子组件接收后不可修改。子组件只能读取props传递给它的数据。如果需要修改或更新父组件的状态,子组件必须通过$emit发射事件将变化传递回父组件。 -
$emit:子组件通过$emit向父组件发送事件通知,通常携带事件的相关数据。父组件通过事件监听器(@event)接收并处理事件,从而更新父组件的状态。
使用场景
props用于父组件向子组件传递数据。$emit用于子组件向父组件传递事件或更新通知。
2. provide 与 inject
-
provide:父组件使用provide向其所有子孙组件提供一个数据源。provide提供的是一个共享的数据源,所有子孙组件都可以通过inject获取到这些数据。provide并不会创建副本,而是传递引用,所以子组件对数据的修改会直接影响父组件。 -
inject:子组件通过inject获取父组件(或祖先组件)通过provide提供的数据。通过inject获取到的数据通常可以直接修改(因为它是引用类型),不过需要注意可能会影响到父组件的状态。
使用场景
provide和inject用于祖先组件与后代组件之间的数据传递。provide提供数据,inject接收数据,并且在需要时可以修改这些数据。
对比总结
| 特性 | props | $emit | provide | inject |
|---|---|---|---|---|
| 数据流 | 父组件 → 子组件 | 子组件 → 父组件 | 父组件 → 所有子孙组件 | 子组件 → 获取父组件或祖先组件的数据 |
| 数据修改 | 子组件不能直接修改父组件的数据 | 子组件通过 $emit 向父组件通知修改 | 子组件可以直接修改数据 | 子组件可以直接修改数据 |
| 用途 | 用于父组件向子组件传递数据 | 用于子组件向父组件发出事件 | 用于祖先组件向后代组件共享数据 | 用于后代组件接收祖先组件共享的数据 |
| 作用范围 | 仅限于父子组件之间 | 仅限于父子组件之间 | 祖先组件可以向所有子孙组件提供数据 | 后代组件可以接收祖先组件提供的数据 |
| 是否创建新副本 | 会为每个子组件创建数据的副本 | 不涉及数据副本 | 提供的数据是引用类型,不会创建副本 | 获取的是引用类型的数据 |
| 数据传递方式 | 单向数据流,父组件传递给子组件 | 子组件通过事件通知父组件 | 数据通过引用共享给所有后代组件 | 子组件通过引用访问祖先组件提供的数据 |
| 父子组件关系 | 父组件控制子组件的数据,子组件只读数据 | 子组件通知父组件,父组件处理事件 | 祖先组件与后代组件之间共享数据 | 后代组件通过 inject 获取祖先组件提供的数据 |
总结:
props与$emit是 父子组件 之间常用的通信机制,父组件通过props传递数据给子组件,子组件通过$emit将事件和数据传递回父组件。provide与inject是 祖先组件与后代组件 之间的通信机制,适用于不直接相邻的组件之间的数据传递。provide提供共享数据,inject接收共享数据,且子组件可以修改这些数据。
除了 props 和 $emit、provide 和 inject,Vue 中还有其他几种数据传递和通信方式,特别是适用于不同组件间的交互。以下是一些常见的传值方式:
1. v-model 双向数据绑定
-
用法:
v-model是 Vue 提供的双向数据绑定的语法糖,主要用于父子组件之间的值传递。通过v-model,子组件可以绑定父组件传递的值,并且可以修改这个值,父组件会接收到修改后的值。 -
工作原理:
v-model会在父组件中生成一个绑定的属性(通常是value),子组件会通过modelValue(Vue 3 中)或value(Vue 2 中)接收这个值,并通过$emit发射事件更新值。 -
示例:
<!-- 父组件 --> <child-component v-model="message"></child-component><!-- 子组件 --> <template><input :value="modelValue" @input="$emit('update:modelValue', $event)"> </template>这样,
v-model可以实现父子组件的双向数据绑定。
2. 事件总线 (Event Bus)
-
用法:事件总线是通过 Vue 实例来实现组件之间的通信,适用于多个组件之间没有直接关系时的通信。父子组件关系无法满足的情况时,可以使用事件总线。
-
工作原理:通过
new Vue()创建一个中央事件总线,将事件注册在事件总线上,其他组件可以通过$on监听事件,通过$emit触发事件。 -
示例:
// 在事件总线文件中创建一个 Vue 实例 export const EventBus = new Vue();// 组件1:触发事件 EventBus.$emit('eventName', data);// 组件2:监听事件 EventBus.$on('eventName', data => {// 处理数据 }); -
注意:事件总线通常不推荐用于大型应用,因为它可能导致难以追踪的状态和事件,尤其是当项目变大时。
3. Vuex 状态管理
-
用法:Vuex 是一个专为 Vue.js 应用程序开发的状态管理库,用于在不同组件之间共享状态。它是适用于跨组件、跨页面、跨模块的数据共享方案。
-
工作原理:Vuex 使用一个中央的
store来存储数据,组件通过store访问状态并提交更改,Vuex 会自动更新相关组件的视图。 -
示例:
// Vuex store 配置 const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}} });// 组件访问 Vuex 状态 this.$store.state.count; this.$store.commit('increment'); -
适用场景:适用于复杂的状态管理,特别是当需要跨组件或跨页面共享和更新状态时,Vuex 是一个非常好的选择。
4. Scoped Slots (作用域插槽)
-
用法:作用域插槽允许子组件向父组件暴露数据,父组件可以通过插槽的作用域来访问这些数据。它是通过插槽和插槽内容传递数据的一种方式。
-
工作原理:通过作用域插槽,父组件可以传递函数给子组件,子组件通过插槽将数据传递给父组件使用。
-
示例:
<!-- 父组件 --> <child-component><template #default="{ item }"><p>{{ item.name }}</p></template> </child-component><!-- 子组件 --> <template><slot :item="item"></slot> </template> -
适用场景:当你想让父组件能够接收到子组件的数据并动态渲染子组件的内容时,可以使用作用域插槽。
5. Local Storage / Session Storage
-
用法:
localStorage和sessionStorage是浏览器提供的 Web 存储机制,它们可以存储数据并在不同的页面或组件之间共享。localStorage是持久化存储,sessionStorage在会话结束时清除。 -
工作原理:你可以通过
localStorage.setItem或sessionStorage.setItem将数据存储到浏览器的本地存储中,然后在其他页面或组件中读取该数据。 -
示例:
// 存储数据 localStorage.setItem('key', 'value');// 获取数据 const value = localStorage.getItem('key'); -
适用场景:适用于需要在多个页面或应用程序会话中保持数据的场景,尤其是需要跨页面共享数据时。
6. Cookie
-
用法:Cookie 是浏览器用于存储少量数据的机制,通常用于保存会话信息、用户认证信息等。
-
工作原理:通过
document.cookie设置和读取 Cookie 数据,浏览器会在后续请求时自动带上 Cookie 数据。 -
示例:
// 设置 Cookie document.cookie = "username=John Doe";// 获取 Cookie const cookies = document.cookie; -
适用场景:适用于跨页面、跨会话的简单数据存储,特别是用户认证和会话信息。
总结对比
| 传值方式 | 适用场景 | 数据流 | 优点 | 缺点 |
|---|---|---|---|---|
props 与 $emit | 父子组件之间的数据传递与事件处理 | 父 → 子,子 → 父 | 简单易用,直观,适用于父子组件间数据交互 | 只适用于父子组件关系 |
provide 与 inject | 祖先组件与后代组件之间的数据传递 | 父 → 后代,子 → 祖先 | 适用于非直系组件间共享数据 | 可能引发数据依赖问题 |
v-model | 双向绑定父子组件间的数据 | 父 ↔ 子 | 自动实现双向绑定 | 需要约定规范,可能引起混乱 |
EventBus | 跨多个组件间的通信,尤其是非直接关系的组件 | 组件 → 组件 | 灵活,适用于多个组件之间的事件通信 | 难以追踪和管理,容易引发不必要的依赖 |
Vuex | 跨多个组件、页面间共享复杂的状态管理 | 全局状态管理 | 强大的状态管理功能,适合大规模应用 | 配置和维护比较复杂 |
Scoped Slots | 父组件控制子组件的内容,同时接收子组件暴露的数据 | 父 ↔ 子 | 灵活的内容插入机制 | 使用场景较为特定 |
LocalStorage/SessionStorage | 跨页面数据共享,数据持久化 | 浏览器存储,跨页面 | 数据持久化,跨页面可访问 | 只适用于简单数据,不适合复杂状态 |
Cookie | 跨会话共享数据,通常用于存储认证信息 | 跨会话,跨页面 | 浏览器自动管理,跨会话持久化 | 存储容量小,安全性较低 |
相关文章:
vue的 props 与 $emit 以及 provide 与 inject 的 组件之间的传值对比
好的,下面是 props 与 $emit 以及 provide 与 inject 的对比: 1. props 与 $emit props:父组件通过 props 向子组件传递数据,子组件接收后不可修改。子组件只能读取 props 传递给它的数据。如果需要修改或更新父组件的状态&#…...
用python批量生成文件夹
问题描述 当批量生成文件夹时,手动右键创建文件夹是一个繁琐的过程,尤其是文件夹的命名过程。假设从3月10日到3月19日,每天要为某个日常工作创建一个名为2025031x的文件夹,手动创建文件夹并命名费时费力。 百度给出了以下四种方法…...
Json 转义符号处理(Mongo changeStream op log)
使用mongo-kafka组件订阅mongo的changeStream得到 一个带有很多转义符号的json字符串 "{\"_id\": {\"_data\": \"8267D0F733000001502B022C0100296E5A1004366730C56F7E41A790BDA4CF23259A4F46645F6964006467B91713A024A00E32CDF6800004\"},…...
懒加载(Lazy Loading):原理、实现与优化策略
懒加载(Lazy Loading) 是一种优化网页性能的技术,主要用于延迟加载非关键资源(如图片、视频、脚本等),直到它们真正需要被使用时才加载。懒加载可以显著减少页面初始加载时间,降低带宽消耗&…...
dns劫持是什么?常见的劫持类型有哪些?如何预防?
DNS劫持的定义 DNS劫持(Domain Name System Hijacking)是一种网络攻击手段,攻击者通过篡改域名解析的过程,将用户对某个域名的访问请求重定向到错误或恶意的IP地址。这种攻击可能导致用户访问到钓鱼网站、恶意广告页面࿰…...
蓝桥杯省赛真题C++B组2024-握手问题
一、题目 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手(但这…...
【MySQL】基本操作 —— DDL
目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…...
XML语法
一、XML简介 (一)定义 XML(eXtensible Markup Language,可扩展标记语言)是一种简单的文本格式,用于标记电子文件使其具有结构性的标记语言。它与HTML(HyperText Markup Language,超…...
游戏引擎学习第152天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库,而是从头开始创建一款游戏,整个开发过程都会呈现给大家。你将能够看到每一行代码的编写,了解…...
考研数学非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
故障诊断——neo4j入门
文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…...
【CXX】6.2 str — rust::Str
Rust::Str 公共 API // rust/cxx.hclass Str final { public:Str() noexcept;Str(const Str &) noexcept;Str(const String &) noexcept;// 如果输入不是 UTF-8,抛出 std::invalid_argument 异常。Str(const std::string &);Str(const char *);Str(con…...
【JavaWeb】快速入门——HTMLCSS
文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…...
unordered_set 的常用函数
在 C 的标准库中,std::unordered_set 是基于哈希表实现的哈希集合。下面介绍这种语言里哈希集合的常用函数。 C std::unordered_set 1. 元素操作 insert 功能:向哈希集合中插入元素。如果元素已经存在,则不会重复插入。示例代码:…...
若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值
目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …...
前端监测窗口尺寸和元素尺寸变化的方法
前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时,相关的JavaScript代码将被触发执行。这为开发者提供了一种机制,可…...
angular中下载接口返回文件
目录 一、URL.createObjectURL() 一、URL.createObjectURL() createObjectURL属于js的原生方法,位于window.URL上,用于将Blob或者File文件转换为可以临时的URL地址进行显示 **注意**:Angular 的 HttpClient 默认将响应解析为 JSON 对象16。…...
ubuntu 部署deepseek
更新 apt update 升级 apt upgrade 格式化硬盘 mkfs.ext4 /dev/sdb 安装nginx 查看端口 一、安装Ollama Ollama是一个开源的大型语言模型(LLM)推理服务器,为用户提供了灵活、安全和高性能的语言模型推理解决方案。 ollama/docs/linux.m…...
【每日学点HarmonyOS Next知识】拖拽调整列表顺序、tab回弹、自定义弹窗this、状态变量修饰枚举
1、HarmonyOS 功能实现(拖拽调整列表顺序)? 可参考: import curves from ohos.curves; import Curves from ohos.curvesEntry Component struct ListItemExample {State private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…...
MySQL库和表的操作详解:从创建库到表的管理全面指南
目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…...
PyTorch 系列教程:使用CNN实现图像分类
图像分类是计算机视觉领域的一项基本任务,也是深度学习技术的一个常见应用。近年来,卷积神经网络(cnn)和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络(cnn) 卷…...
Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上
Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上 1、环境介绍 QT版本:5.15.1 待移植环境: jetson nano 系列开发板 aarch64架构(arm64) 编译环境: 虚拟机Ubuntu18.04(x86_64) 2、…...
Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
starrocks批量启停脚本
#!/bin/bash # 定义 StarRocks 安装目录 STARROCKS_HOME"/path/to/starrocks" # 定义 FE 和 BE 节点列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…...
「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例
在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…...
4.3 数组和集合的初始及赋值
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商…...
Deep research深度研究:ChatGPT/ Gemini/ Perplexity/ Grok哪家最强?(实测对比分析)
目前推出深度研究和深度检索的AI大模型有四家: OpenAI和Gemini 的deep research,以及Perplexity 和Grok的deep search,都能生成带参考文献引用的主题报告。 致力于“几分钟之内生成一份完整的主题调研报告,解决人力几小时甚至几天…...
关于sqlalchemy的ORM的使用
关于sqlalchemy的ORM的使用 二、创建表三、使用数据表、查询记录三、批量插入数据四、关于with...as...:的使用 二、创建表 使用Mapped来映射字段 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,Mapped,mapped_columnBa…...
【leetcode hot 100 148】排序序列
解法一:(双重循环)第一个循环head,逐步将head的node加入有序列表;第二个循环在有序列表中找到合适的位置,插入node。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …...
3-001:MySQL 中的回表是什么?
1. 什么是回表? 回表(Back to Table) 指的是 在使用非聚簇索引(辅助索引)查询时,MySQL 需要 先通过索引找到主键 ID,然后再回到主键索引(聚簇索引)查询完整数据…...
