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

news2024/5/18 12:54:39

第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.coloradmin.cn/o/1641552.html

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

相关文章

手撸Mybatis(四)——连接数据库进行简单查询

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 添加数据库操作模板 对于JDBC操作&#xff0c;一般包括以下几个步骤&#xff1a; 1&#xff09;注册驱动 2&#xff09;建立连接 3&#xff09;执行sql语句 4&#xff09;处理结果 5&#xff09…

【neteq】tgcall的调用、neteq的创建及接收侧统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

Boosting算法揭秘:从原理到scikit-learn实战

Boosting算法揭秘&#xff1a;从原理到scikit-learn实战 在机器学习的江湖中&#xff0c;Boosting算法以其强大的预测能力和独特的训练方式占据了一席之地。与Bagging算法并行训练的理念不同&#xff0c;Boosting算法更注重模型的串行迭代和错误修正。本文将从Boosting算法的基…

JVM笔记1--Java内存区域

1、运行时数据区域 从上图可以看出来&#xff0c;Java虚拟机运行时数据区域整体上可以分成5大块&#xff1a; 1.1、程序计数器 程序计数器是一块较小的内存空间。它可以看做当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c;字节码解释器工作时就是…

【热门话题】Chrome 插件研发详解:从入门到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Chrome 插件研发详解&#xff1a;从入门到实践一、引言二、Chrome 插件基础概念…

汇编语言——输入两个字数据(16位的数)X,Y,计算Z=X+Y,并把Z的结果显示出来

文章目录 以2进制输入&#xff0c;2进制输出&#xff08;无符号&#xff09;以2进制输入&#xff0c;2进制输出&#xff08;带符号&#xff09;以8进制输入&#xff0c;8进制输出以10进制输入&#xff0c;10进制输出以16进制输入&#xff0c;16进制输出 仅供参考 X、Y的输入可…

08 - 步骤 表输出

简介 表输出&#xff08;Table Output&#xff09;步骤是用于将 Kettle 中的数据写入关系型数据库表的步骤。它允许用户将数据流中的数据插入、更新或删除到目标数据库表中。 使用 场景 我要将处理完的数据流中的sysOrgCode 跟 plateNumber 保存记录到mysql 1、拖拽表输出…

目标检测算法YOLOv5简介

没有关于YOLOv5的直接论文&#xff0c;YOLOv5由Ultralytics维护&#xff0c;源码见&#xff1a;https://github.com/ultralytics/yolov5 &#xff0c;于2020年6月发布v1.0版本&#xff0c;最新发布版本为v7.0&#xff0c;License为AGPL-3.0. 以下内容主要来自&#xff1a; 1. U…

MyScaleDB:SQL+向量驱动大模型和大数据新范式

大模型和 AI 数据库双剑合璧&#xff0c;成为大模型降本增效&#xff0c;大数据真正智能的制胜法宝。 大模型&#xff08;LLM&#xff09;的浪潮已经涌动一年多了&#xff0c;尤其是以 GPT-4、Gemini-1.5、Claude-3 等为代表的模型你方唱罢我登场&#xff0c;成为当之无愧的风口…

【R语言数据分析】卡方检验

目录 交叉卡方检验 配对卡方检验 趋势卡方检验 交叉卡方检验 交叉卡方表用于比较组间“率”的差异。适用于分类型变量&#xff0c;被检验的分类变量应该是无序分类变量&#xff0c;分组变量可以是有序分组也可以是无序分组。比如比较两种药物治疗某个疾病的效率&#xff0c;…

Bartender 5 - MacBook菜单栏图标管理软件

当 macOS 桌面图标太多时&#xff0c;既不美观又经常会相互遮盖&#xff0c;非常影响操作。 苹果现在还把「刘海屏」发扬光大&#xff0c;MacBook 的菜单栏是越来越不方便了&#xff01; 如果你希望 Mac 的菜单栏干净清爽、又方便易用&#xff0c;那「Bartender 5」你一定要试…

第15章 基于规格说明的测试技术

一、概述 &#xff08;一&#xff09;依据 《软件需求规格说明书》以及对应的模型或用户需求。 &#xff08;二&#xff09;特点 不考虑内部结构和内部特征 &#xff08;三&#xff09;测试用例满足的标准 利用黑盒测试技术导出测试用例 &#xff08;四&#xff09;测试…

基于 Wireshark 分析 ICMP 协议

一、ICMP 协议 ICMP&#xff08;Internet Control Message Protocol&#xff09;即互联网控制报文协议&#xff0c;是TCP/IP协议簇的一个子协议。它主要用于在IP主机、路由器之间传递控制消息&#xff0c;这些消息涉及网络是否通畅、主机是否可达、路由是否可用等关于网络本身…

2024年北京高校后勤餐饮博览会|北京餐饮展览会

高联采高校后勤餐饮博览会 暨第25届北京高校后勤餐饮联合招标采购大会 同期举办&#xff1a;中国北京餐饮供应链博览会 主 题&#xff1a; 因为FOOD校园GOOD / 同创高校大舞台共享精彩高联采 时 间&#xff1a;2024年9月21日-22日 地 点&#xff1a;中国国际展览中心&…

利用大模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…

【Hadoop】--基于hadoop和hive实现聊天数据统计分析,构建聊天数据分析报表[17]

目录 一、需求分析 1、背景介绍 2、目标 3、需求 4、数据内容 5、建库建表 二、ETL数据清洗 1、数据问题 2、需求 3、实现 4、扩展概念&#xff1a;ETL 三、指标计算 1、指标1&#xff1a;统计今日消息总量 2、指标2&#xff1a;统计每小时消息量、发送量和接收用…

python学习笔记----面向对象(十)

一、什么是类 类是一个抽象的模板&#xff0c;用于创建具体的实例。可以将类理解为一个蓝图&#xff0c;它定义了一系列对象共有的属性&#xff08;数据&#xff09;和方法&#xff08;函数&#xff09;。类是对一组具有相同属性和功能的对象的抽象。例如&#xff0c;你可以定…

FIFO Generate IP核使用——Native读写接口信号详解

Native FIFO接口信号是用于FIFO IP核与外部电路进行通信的信号。当FIFO支持独立的写和读时钟时&#xff0c;这些信号可以包括标准端口和可选端口。 1 当FIFO具有独立时钟时的接口信号 当FIFO具有独立的时钟时&#xff0c;其接口信号会相应地有所变化。特别是关于复位信号rst…

政安晨:【Keras机器学习示例演绎】(三十二)—— 在 Vision Transformers 中学习标记化

目录 导言 导入 超参数 加载并准备 CIFAR-10 数据集 数据扩增 位置嵌入模块 变压器的 MLP 模块 令牌学习器模块 变换器组 带有 TokenLearner 模块的 ViT 模型 培训实用程序 使用 TokenLearner 培训和评估 ViT 实验结果 参数数量 最终说明 政安晨的个人主页&…

Ubuntu TeamViewer安装与使用

TeamViewer是一款跨平台的专有应用程序&#xff0c;允许用户通过互联网连接从全球任何地方远程连接到工作站、传输文件以及召开在线会议。它适用于多种设备&#xff0c;例如个人电脑、智能手机和平板电脑。 TeamViewer在交通不便或偏远地区使用电脑问题时&#xff0c;将发挥重…