Vue 父子组件通信进阶版:深入理解 Props、$emit 和 provide/inject

文章目录

    • 🍑引言
    • 🍑Props 进阶用法
      • 🍇动态 Props
      • 🍇验证复杂对象
    • 🍑$emit 进阶用法
      • 🍇传递事件参数
      • 🍇使用修饰符
    • 🍑provide/inject 进阶用法
      • 🍇动态 provide
      • 🍇通过 inject 获取 provide 数据
    • 🍑结语

Vue 提供了多种方式来实现父子组件之间的通信,其中包括基本的 Props 和 $emit,以及高级的 provide 和 inject。本文将深入探讨这些技术,带你了解它们的适用场景和如何更灵活地应用在 Vue 项目中。

🍑引言

在 Vue 开发中,组件通信是一个常见而重要的主题。了解不同的通信方式,可以让你更好地组织和设计你的组件架构。本文将介绍 Vue 中父子组件通信的进阶版,重点探讨 Props、$emit 和 provide/inject 这三种方式的高级用法。

🍑Props 进阶用法

🍇动态 Props

除了基本的 Props 用法外,我们还可以通过绑定动态值实现更灵活的传递。考虑以下场景:

<template><child :config="dynamicConfig" />
</template><script>
export default {data() {return {dynamicConfig: { propA: 'valueA', propB: 'valueB' }};}
};
</script>

子组件接收动态 Props:

<template><div>{{ config.propA }}, {{ config.propB }}</div>
</template><script>
export default {props: {config: { type: Object, required: true }}
};
</script>

🍇验证复杂对象

当 Props 是一个复杂对象时,我们可以使用自定义验证函数来确保传递的数据结构符合预期:

<script>
export default {props: {config: {type: Object,required: true,validator: value => {return 'propA' in value && 'propB' in value;}}}
};
</script>

这样,我们可以在验证函数中对复杂对象进行更细致的验证,确保 Props 的数据质量。

🍑$emit 进阶用法

🍇传递事件参数

在使用 $emit 时,我们通常会携带一些额外的参数。比如:

<template><button @click="handleClick">Click me</button>
</template><script>
export default {methods: {handleClick() {this.$emit('custom-event', 'additional data');}}
};
</script>

父组件中接收并处理事件参数:

<template><child @custom-event="handleCustomEvent" />
</template><script>
export default {methods: {handleCustomEvent(data) {console.log('Received data:', data);}}
};
</script>

🍇使用修饰符

Vue 的 $emit 还支持事件修饰符,这使得我们可以更灵活地控制事件的传播和处理过程。例如,.stop 修饰符可以阻止事件冒泡:

<template><button @click.stop="handleClick">Click me</button>
</template><script>
export default {methods: {handleClick() {// 该方法将不会被触发}}
};
</script>

🍑provide/inject 进阶用法

🍇动态 provide

在某些情况下,我们可能需要根据组件的状态来动态提供数据。这时,我们可以使用函数来返回 provide 的数据:

<script>
export default {provide() {return {dynamicData: this.dynamicData};},data() {return {dynamicData: 'Dynamic Data'};}
};
</script>

🍇通过 inject 获取 provide 数据

在子组件中使用 inject 获取 provide 提供的数据:

<template>  <!-- 这是一个Vue的模板 --><div>{{ injectedData }}</div>  <!-- 在模板中使用注入的数据 -->
</template><script>
export default {  // 导出Vue组件inject: ['dynamicData'],  // 从父组件中注入名为dynamicData的属性computed: {injectedData() {  // 计算属性,返回注入的数据return this.dynamicData;}}
};
</script>

通过提供更灵活的动态数据和使用 provide/inject,我们可以更好地组织组件之间的通信,使得代码更为可维护和可扩展。

🍑结语

通过深入理解 Vue 组件通信的高级用法,我们可以更好地应对各种场景和需求。合理使用 Props、$emit 和 provide/inject 可以让你的组件架构更加清晰和灵活。


🏫博客主页:魔王-T

🥝大鹏一日同风起 扶摇直上九万里

❤️感谢大家点赞👍收藏⭐评论✍️


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

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

相关文章

gitlab 通过svn hook 触发

jenkins 起一个item 配置&#xff1a; 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径&#xff0c; 注意是工程&#xff0c;不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器&#xff1a; &#xff0c;重要的是要自…

C练习题_2答案

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述中错误的是(C)A.对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B.数组名代表的是数组所占存储…

【二分查找】【z型搜索】LeetCode240:搜索二维矩阵

LeetCoe240搜索矩阵 本文涉及的基础知识点 二分查找算法合集 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;…

翻译: ChatGPT Token消耗粗略计算英文就是除以四分之三

在这个视频中&#xff0c;我想带你快速浏览一些例子&#xff0c;以建立对在软件应用中使用大型语言模型的实际成本的直观感受。让我们来看看。这是一些示例价格&#xff0c;用于从不同的大型语言模型获取提示和回应&#xff0c;这些模型对开发者可用。即&#xff0c;如果你在你…

11、避免消费者组非必要重平衡的方法

避免消费者组非必要重平衡的方法 1、重平衡的 3 个弊端1.1、影响 consumer 端 TPS1.2、重平衡很慢1.3、重平衡操作效率不高 2、非必要的 2 类 Rebalance2.1、因为 Consumer 没能及时发送心跳请求&#xff0c;导致“被踢出” Group 而引发的。2.2、非必要 Rebalance 是 Consumer…

C#浅拷贝和深拷贝数据

目录 一、浅拷贝 二、深拷贝 一、浅拷贝 就是把原来的数据&#xff0c;复制一份&#xff0c;但是2份数据是共享地址的&#xff0c;修改第一份数据或者修改第二份数据&#xff0c;都会一起改变&#xff0c;这可能不是我们程序中需要的场景。 下面我们演示一下&#xff0c;首…

【BIG_FG_CSDN】C++ 类与对象 (个人向——学习笔记)

基本概念&#xff1a; 类->类型&#xff1b;类描述抽象概念的&#xff1b; 对象->变量&#xff1b;对象描述客观实的&#xff1b; 在进行面向对象程序设计时要先声明类&#xff0c;再创建该类的对象。 为了方便讲述与理解这里我使用一个例题进行讲解吧。 例子&#…

《javaweb——文件上传-分页查询》

1、文件上传 1.文件上传的应用场景&#xff1a;提交作业 上传头像 提交简历&#xff08;上传附件&#xff09; 上传商品&#xff0c;图书图片 2.文件上传的前台如何编写以及注意事项&#xff1a; 1.肯定需要用到表单 2.文件上传的那一栏需…

Vue 自定义搜索输入框SearchInput

效果如下&#xff1a; 组件代码 <template><div class"search-input flex flex-space-between flex-center-cz"><input type"text" v-model"value" :ref"inpuName" :placeholder"placeholder" keyup.enter&…

java 统计中文字符个数能用length吗

在Java中&#xff0c;统计中文字符的个数可以使用length()方法。但是&#xff0c;这只能统计中文字符串的长度&#xff0c;不能判断其中是否包含中文字符。如果你需要统计一个字符串中中文字符的个数&#xff0c;你可能需要使用正则表达式或者其它方式来判断每个字符是否为中文…

【赠书第11期】Unity 3D游戏开发

文章目录 前言 1 Unity 3D简介 2 Unity 3D基本概念 2.1 场景&#xff08;Scene&#xff09; 2.2 游戏对象&#xff08;Game Object&#xff09; 2.3 组件&#xff08;Component&#xff09; 2.4 资源&#xff08;Asset&#xff09; 3 Unity 3D重要组件 3.1 物理引擎 …

HarmonyOS4.0从零开始的开发教程18HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十六&#xff09;HarmonyOS应用/元服务上架 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c…

高性价比AWS Lambda无服务体验

前言 之前听到一个讲座说到AWS Lambda服务&#xff0c;基于Serverless无服务模型&#xff0c;另外官网还免费提供 100 万个请求 按月&#xff0c;包含在 AWS 免费套餐中是真的很香&#xff0c;对于一些小型的起步的网站或者用户量不大的网站&#xff0c;简直就是免费&#xff…

Flink系列之:Top-N

Flink系列之&#xff1a;Top-N 一、TOP-N二、无排名输出优化 一、TOP-N 适用于流、批Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。最小值和最大值集都被认为是Top-N查询。在需要从批表或流表中仅显示 N 个底部或 N 个顶部记录时&#xff0c;Top-N 查询是非常有用…

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

[Spring 从模拟开始学习源码]`@Value`的底层实现

Value 注入主要有三种场景&#xff1a; 注入原始值&#xff0c;比如说注入Value("hello")注入变量&#xff0c;比如Value("${JAVA_HOME}")注入spel表达式&#xff0c;比如Value("#{1 2}") 文章目录 获取 Value内容解析 ${}内容解析 SPEL类型转换…

云计算:Vmware 安装 FreeNAS

目录 一、实验 1.Vmware 安装 FreeNAS 2.配置Web界面 二、问题 1.iSCSI如何限定名称 2.LUN和LVM的区别 一、实验 1.Vmware 安装 FreeNAS &#xff08;1&#xff09;环境准备 VMware Workstation 17 FreeNAS相关安装部署镜像: 官网地址&#xff1a; https://download…

【linux】SSH终端Putty配置:文件上传/下载、显示中文字体、自动登录

文章目录 写在前面putty上传/下载文件1. 下载2. 解压和配置3. 使用sz/rz3.1 下载文件:sz3.2 上传文件:rz 显示中文字体1. 下载合适的字体2. 解压和安装3. putty配置 putty自动登录1. putty配置2. putty快捷方式配置3. 使用putty 写在后面 写在前面 一篇博客介绍了12种SSH终端工…

力扣刷题记录(10)LeetCode:51、37

51. N 皇后 应为各个皇后之间不能同行&#xff0c;所以一行只能有一个皇后。我们可以遍历每一行的各个位置&#xff0c;判断该位置是否可以放置皇后&#xff0c;一行放置一个。当一个皇后的位置已经在这一行确定了&#xff0c;我们就可以遍历下一行来确定下一个皇后在下一行的位…

laravel8 安装swoole扩展

,1&#xff0c;确保你的开发环境满足要求&#xff0c;包括 PHP 版本和相关的扩展。Swoole 扩展要求 PHP 版本为 7.2 或更高&#xff0c;并且需要安装 Swoole 扩展本身。 ,2&#xff0c;打开终端或命令行窗口&#xff0c;并导航到你的 Laravel 项目目录。 ,3&#xff0c;使用 …