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

2024-05-04 10:28

本文主要是介绍第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” 或 “钻石问题”。

这篇关于第IV章-Ⅰ Vue3组件与组件通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958986

相关文章

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

vue+el国际化-东抄西鉴组合拳

vue-i18n 国际化参考 https://blog.csdn.net/zuorishu/article/details/81708585 说得比较详细。 另外做点补充,比如这里cn下的可以以项目模块加公共模块来细分。 import zhLocale from 'element-ui/lib/locale/lang/zh-CN' //引入element语言包const cn = {mess

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在