第IV章-Ⅰ Vue3组件与组件通信

第IV章-Ⅰ Vue3组件与组件通信

  • Vue组件
    • 根组件
    • 全局组件
    • 局部组件
    • 组件模板
    • 父子组件
  • 组件间通信
    • 子组件获取父组件数据
      • 数据传递选项prop
      • 传值校验
      • 单向数据流
    • 父组件获取子组件数据
      • emit 方法
    • 多级组件通信
      • provide 声明要传递的数据
      • inject 接收数据
  • 总结
  • 应用场景
    • 单向数据流(Props)
    • 事件通信(Emit)
    • 跨层级通信(Provide/Inject)

Vue组件

根组件

根组件是 Vue 应用的主要入口点。在 Vue 3 中,根组件通常是通过 createApp 函数创建的,然后挂载到一个 DOM 元素上。

import { createApp } from 'vue';
import App from './App.vue';

const app = createApp(App);
app.mount('#app');

vue2中 根组件时通过new Vue 构造函数创建的。

import Vue from 'vue';
import App from './App.vue';

new Vue({
  el: '#app',
  render: h => h(App)
});

全局组件

全局组件在 Vue 3 中通常在应用创建时通过 app.component 方法注册,这意味着它们可以在任何组件模板中无需导入就可以使用。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import MyGlobalComponent from './components/MyGlobalComponent.vue';

const app = createApp(App);
app.component('MyGlobalComponent', MyGlobalComponent);
app.mount('#app');

局部组件

局部组件只在注册它们的组件内可用。这有助于封装组件逻辑和模板,使其不会泄漏到全局范围。

// App.vue
<template>
  <div>
    <my-local-component />
  </div>
</template>

<script setup>
import MyLocalComponent from './components/MyLocalComponent.vue';

export default {
  components: {
    MyLocalComponent
  }
}
</script>

组件模板

组件模板定义了组件的 HTML 结构。在 Vue 3 中,模板可以在单文件组件 (SFC) 的 标签中定义,或者在 JavaScript 中通过模板字符串定义。

// MyComponent.vue
<template>
  <div>{{ message }}</div>
</template>

<script setup>
import { ref } from 'vue';

const message = ref('Hello, Vue 3!');
</script>

父子组件

// ParentComponent.vue
<template>
  <child-component :myProp="parentData" @myEvent="handleEvent"/>
</template>

<script setup>
import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';

const parentData = ref('Data from parent');
const handleEvent = (data) => console.log('Event received:', data);

export default {
  components: {
    ChildComponent
  }
}
</script>

// ChildComponent.vue
<template>
  <button @click="emitEvent">Send Event</button>
</template>

<script setup>
import { defineProps, defineEmits } from 'vue';

const props = defineProps({
  myProp: String
});
const emit = defineEmits(['myEvent']);

const emitEvent = () => emit('myEvent', 'Data from child');
</script>

组件间通信

子组件获取父组件数据

<!-- ParentComponent.vue -->
<template>
  <child-component :user="userData" />
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const userData = ref({ name: 'Alice', age: 30 });
</script>

<!-- ChildComponent.vue -->
<template>
  <div>{{ user.name }}</div>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  user: {
    type: Object,
    required: true,
    default: () => ({ name: '', age: 0 })
  }
});
</script>

数据传递选项prop

父组件可以将数据通过 props 传递给子组件。

传值校验

在子组件中,可以对接收的 props 进行类型、必需性等校验。

单向数据流

props 是单向数据流,即只能从父组件流向子组件,子组件不应直接修改接收的 props。

父组件获取子组件数据

<!-- ChildComponent.vue -->
<template>
  <button @click="sendData">Send Data to Parent</button>
</template>

<script setup>
import { defineEmits } from 'vue';

const emit = defineEmits(['update']);

const sendData = () => {
  emit('update', { newData: 'Updated info from child' });
};
</script>
<!-- ParentComponent.vue -->
<template>
  <div>
    <child-component @update="handleUpdate" />
    <p>{{ dataFromChild }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const dataFromChild = ref('');

const handleUpdate = (payload) => {
  console.log('Received data:', payload);
  dataFromChild.value = payload.newData;  // 更新来自子组件的数据
};
</script>

在 <child-component @update=“handleUpdate” /> 中,@update 是用来监听来自 ChildComponent 的 update 事件。
handleUpdate 是在父组件中定义的方法,用于处理从子组件接收到的数据。
handleUpdate 函数接收一个参数 payload,这个参数包含了子组件通过 emit 方法发送的数据。
在这个例子中,我们假设 payload 是一个对象,其中包含一个属性 newData。
使用 ref 来定义 dataFromChild,这是一个响应式引用,存储从子组件接收到的数据。
当子组件发送数据时,通过更新 dataFromChild.value,这个更新会自动反映在父组件的模板中,显示最新的值。

emit 方法

子组件可以使用 $emit 方法来向父组件发送事件(可附带数据)。

多级组件通信

<!-- ParentComponent.vue -->
<script setup>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const sharedData = ref('Shared info for deep components');
provide('sharedKey', sharedData);
</script>

<!-- ChildComponent.vue -->
<script setup>
import { inject } from 'vue';

const sharedData = inject('sharedKey');
</script>

provide 声明要传递的数据

顶层组件或任意父组件使用 provide 来定义可以被子孙组件注入的数据。

inject 接收数据

任意子孙组件可以使用 inject 来接收上游组件提供的数据。

总结

  • 单向数据流(Props):保证了数据的可预测性和管理性,是最常用的通信方式,适用于父子组件。
  • 事件通信(Emit):允许子组件向父组件发送消息,是实现子向父通信的标准方法。
  • 跨层级通信(Provide/Inject):解决了深层嵌套组件间的通信问题,避免了繁琐的 props 传递。

应用场景

单向数据流(Props)

  • 组件封装与重用:当你开发可重用的组件时,如按钮、输入框、选择器等,使用 props 传递数据可以保证组件的独立性和封装性。组件只依赖于通过 props 接收的数据,而不关心数据的来源,这使得组件可以在不同的上下文中重用。
  • 父子组件结构:在父子组件的关系中,父组件通常扮演数据源的角色,子组件根据传入的 props 进行渲染。例如,一个博客列表组件(父组件)可能包含多个博客条目组件(子组件),每个条目组件通过 props 接收具体的博客数据。
  • 配置组件:使用 props 来传递配置选项,如是否禁用输入框、是否显示边框等,可以让组件的使用更加灵活。

事件通信(Emit)

  • 表单组件:在自定义表单控件(如日期选择器、滑块等)中,子组件需要通知父组件用户的交互动作,如选中的日期、滑动的值等。子组件可以使用 emit 来发送这些信息。
  • 操作反馈:在用户执行操作如点击按钮时,如果需要父组件处理某些逻辑(如打开弹窗、提交表单等),子组件可以 emit 一个事件来触发父组件的方法。
  • 状态更新:当子组件需要更新其不直接拥有的状态时,可以通过 emit 请求父组件进行状态更新。例如,一个任务列表项可能需要通知其父组件来删除一个任务。

跨层级通信(Provide/Inject)

  • 主题或配置共享:当需要在整个应用中共享如主题颜色、用户偏好设置等全局数据时,可以在根组件或一个高层组件中 provide 这些数据,任何子组件都可以通过 inject 来访问它。
  • 依赖注入:在大型应用中,特定的功能如权限管理、国际化(i18n)工具等可能需要在许多组件中使用。通过 provide/inject 可以将这些工具或服务注入到需要它们的任何组件中,无需通过所有中间组件传递。
  • 避免 prop 钻石问题:在复杂的组件结构中,如果多个层级的组件需要相同的数据,使用 provide/inject 可避免多层传递 props,这种情况通常称为 “props drilling” 或 “钻石问题”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】集成方法---Boosting之AdaBoost

一、Boosting的介绍 1.1 集成学习的概念 1.1.1集成学习的定义 集成学习是一种通过组合多个学习器来完成学习任务的机器学习方法。它通过将多个单一模型&#xff08;也称为“基学习器”或“弱学习器”&#xff09;的输出结果进行集成&#xff0c;以获得比单一模型更好的泛化性…

上海计算机学会2021年1月月赛C++丙组T2康托表

题目背景 康托是一名数学家&#xff0c;他证明了一个重要的定理&#xff0c;需要使用一张表&#xff1a; 这个表的规律是&#xff1a; 从上到下&#xff1a;每一行的分子依次增大&#xff1b;从左到右&#xff1a;每一列的分母依次增大。 康托以一种不重复、不遗漏的方式&am…

【深耕 Python】Quantum Computing 量子计算机(1)图像绘制基础

一、绘制静止图像 使用matplotlib库绘制函数图像y sin(pi * x): import math import matplotlib.pyplot as pltx_min -2.0 x_max 2.0N 1000x1 [] y1 []for i in range(N 1):x x_min (x_max - x_min) * i / Ny math.sin(math.pi * x)x1.append(x)y1.append(y)plt.xl…

关于继承~

继承 动物有猫、狗&#xff0c; 猫又分为加菲猫、布偶猫......&#xff1b;狗又有哈士奇、德国牧羊犬...... 我们发现&#xff0c;下一类除了拥有上一类的共性之外&#xff0c;还拥有自己的特性。 于是我们可以利用继承的方式来减少重复的代码 继承的基本语法 class A:p…

二叉树的直径

题目描述&#xff1a;给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root […

在剪映专业版中新增字体的方法

我一开始以为剪映专业版没有繁体字&#xff0c;结果发现有一个现代繁体&#xff0c;如图所示: 但是我已经下载了字体了&#xff0c;不用就可惜了。 点击汉仪粗黑繁&#xff0c;安装。 安装之后&#xff0c;重启电脑&#xff0c;打开剪映&#xff0c;就可以搜索到这个字体了。 这…

每日OJ题_贪心算法二④_力扣2418. 按身高排序

目录 力扣2418. 按身高排序 解析代码 力扣2418. 按身高排序 2418. 按身高排序 难度 简单 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个…

罗宾斯《管理学》第13版/教材讲解/考研真题视频课程/网课

本课程是罗宾斯《管理学》&#xff08;第13版&#xff09;精讲班&#xff0c;为了帮助参加研究生招生考试指定考研参考书目为罗宾斯《管理学》&#xff08;第13版&#xff09;的考生复习专业课&#xff0c;我们根据教材和名校考研真题的命题规律精心讲解教材章节内容。 序号名…

读天才与算法:人脑与AI的数学思维笔记17_歌曲的创作公式

1. 人为何创作音乐 1.1. 音乐一直具有算法性质&#xff0c;这意味着在所有的艺术形式中&#xff0c;它受到人工智能进步的威胁最大 1.1.1. 音乐也是所有艺术形式中最抽象的一种&#xff0c;它利用结构和模式&#xff0c;而正是这种抽象的性质使它与数学紧密相连 1.1.2. 在这…

查找算法之二分查找

一、算法介绍 二分查找&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。对于包含 n 个元素的有序数组&#xff0c;二分查找的步骤如下&#xff1a; 确定搜索范围&#xff1a;首先&#xff0c;将要查找的元素与数组中间的元素进行比较。如果…

【C++】学习笔记——string_5

文章目录 六、string类7. string类的模拟实现8. string类的模拟实现的完整代码string.h头文件test.c源文件 9. string收尾写时拷贝 未完待续 六、string类 7. string类的模拟实现 我们之前讲了实现 insert &#xff0c;但是那个插入函数仅仅是在 pos 位置插入一个字符而且&am…

13.1 QQ邮箱

1. 邮箱发送 2. 准备工作 3. 整合SpringBoot 3.1 配置 依赖引入 <!-- 邮件服务--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>application.…

发表博客之:transformer 架构 推理时候运算流程详细讲解,以及变长推理支持,小白都可以看得懂,AI推理工程师必备技能!

文章目录 [发表博客之&#xff1a;transformer 架构 推理时候运算流程详细讲解&#xff0c;以及变长推理支持&#xff0c;小白都可以看得懂&#xff0c;AI推理工程师必备技能&#xff01;](https://cyj666.blog.csdn.net/article/details/138439826)总结一下高性能变长推理 发表…

DevicData-P-XXXXXX勒索病毒有什么特点,如何恢复重要数据?

DevicData-P-XXXXXXXX这种新型勒索病毒有什么特点&#xff1f; DevicData-P-XXXXXXXX勒索病毒的特点主要包括以下几点&#xff1a; 文件加密&#xff1a;该病毒会搜索并加密用户计算机上的重要文件&#xff0c;如文档、图片、视频等&#xff0c;使其无法正常打开。这是通过强…

IoTDB 入门教程 问题篇②——RPC远程连接IoTDB服务器失败

文章目录 一、前文二、发现问题三、分析问题四、检查6667端口是否监听所有IP五、检查ECS云服务器的安全组是否允许六、检查Linux防火墙是否允许 一、前文 IoTDB入门教程——导读 二、发现问题 使用本地IP127.0.0.1可以连接IoTDB服务器使用远程IPxx.xx.xx.xx却连接不到。提示你…

抖音小店怎么运营操作,无货源正确做店方式,新手就看这一篇

大家好&#xff0c;我是电商笨笨熊 当前抖店还能做无货源模式吗&#xff1f; 当然可以。 近两年由于平台对于无货源的打击&#xff0c;很多人开始怀疑&#xff0c;无货源模式在抖店还能行得通吗&#xff1f; 抖店这个项目我们做了四年多的时间&#xff0c;无货源模式也是&a…

双fifo流水线操作——verilog练习与设计

文章目录 一、案例分析二、fifo_ctrl模块设计2.1 波形设计&#xff1a;2.2 代码实现2.2.1 fifo_ctrl2.2.2 顶层文件top_fifo_ctrl&#xff08;rx和tx模块省略&#xff09;2.2.3 仿真文件tb_fifo_ctrl 2.3波形仿真 一、案例分析 案例要求&#xff1a;写一个 fifo 控制器&#x…

vivado Aurora 8B/10B IP核(12)- Setp By Step搭建FPGA工程

Step1:任意创建一个新的空的工程&#xff08;创建工程的具体工程如果还不清楚的看我们教程第一季部分&#xff09;&#xff0c; 并且进入IP CORE列表 右击Customize ip Step2:配置 IP CORE-Core options Step3:配置 IP CORE-GT Selections Step4:配置 IP CORE-Shared Logic 为 …

深入解析Python中的`add_argument`用法

深入解析Python中的add_argument用法 在Python编程中&#xff0c;add_argument通常与命令行参数解析库argparse有关。这个库主要用于编写用户友好的命令行接口&#xff0c;其核心功能之一就是通过add_argument方法来指定程序可以接受哪些命令行参数。本篇博客将详细介绍argpar…

badKarma:一款功能强大的网络侦查GUI工具

关于badKarma badKarma是一款开源的网络侦查工具&#xff0c;该工具基于Python 3开发&#xff0c;提供了友好的图形化用户接口&#xff0c;可以帮助广大渗透测试人员在网络基础设施安全审计过程中执行网络侦查任务。 badKarma是一个模块化工具&#xff0c;基于python3 GTK套件…