揭秘 Vue 组件通信:构建响应式数据流

引言

Vue.js 的核心特性之一是其组件化架构。组件化开发是一种现代的前端开发模式,它鼓励开发者将用户界面拆分成独立的、可复用的组件。每个组件都有自己的逻辑和结构,使得代码更加模块化,易于维护和测试。

Vue 组件基础

  1. 组件的定义和用途

    • Vue 组件是可复用的 Vue 实例,它们通常包含 HTML、CSS 和 JavaScript。
    • 组件的主要用途是封装可复用的代码和结构,使得开发者可以专注于应用程序的不同部分。
  2. 组件的创建和注册

    • 组件可以通过全局注册或局部注册来创建和注册。
    • 全局注册的组件可以在任何模板中直接使用,而局部注册的组件只能在注册它的父组件模板中使用。

关于组件全局注册和局部注册示例

全局注册

  1. 安装组件:首先,你需要将组件作为一个 npm 包安装到你的项目中。

    npm install my-component --save
    
  2. 全局注册:在项目的入口文件(通常是 main.js 或 app.js)中,使用 Vue.component 方法全局注册组件。

    import Vue from 'vue';
    import MyComponent from './path-to-my-component';Vue.component('my-component', MyComponent);new Vue({el: '#app'
    });
    

局部注册

  1. 定义组件:在组件文件中定义你的组件。

    export default {template: '<div>A local component!</div>'
    };
    
  2. 在父组件中注册:在父组件的 components 选项中注册子组件。

    import MyComponent from './path-to-my-component';export default {components: {'my-component': MyComponent}
    };
    
  3. 在模板中使用:在父组件的模板中使用子组件。n

    <template><my-component></my-component>
    </template>
    

请注意,这些步骤假设你已经安装了 Vue.js 作为项目的一部分,并且你正在使用 npm 或 yarn 来管理依赖。如果你的项目使用的是 Vue CLI,它会自动处理包的安装和依赖管理。

注册后如何使用

全局注册后使用组件
  1. 在模板中直接使用:全局注册的组件可以直接在模板中使用,不需要在组件内部再次注册。

    <div id="app"><global-component></global-component>
    </div>
    
  2. 在组件中使用:如果你在组件的模板中使用全局注册的组件,你不需要在组件的 components 选项中再次注册它。

    <template><global-component></global-component>
    </template>
    
局部注册后使用组件
  1. 在模板中直接使用:局部注册的组件只能在注册它的父组件模板中使用,其他组件无法直接使用它。

    <div id="app"><local-component></local-component>
    </div>
    
  2. 在组件中使用:如果你在组件的模板中使用局部注册的组件,你需要在组件的 components 选项中注册它。

    /*不要忘记把组件import进来,像这样:import LocalComponent from './path-to-local-component'*/
    <template><local-component></local-component>
    </template><script>
    export default {components: {'local-component': LocalComponent}
    };
    </script>
    

 

 父子组件通信

通过 Props 传递数据
  • 单向数据流:在 Vue 中,数据是单向传递的,从父组件流向子组件。这意味着父组件可以传递数据给子组件,但子组件不能直接修改父组件的数据。

  • Prop 验证:在子组件中,你可以通过 props 选项来验证父组件传递给你的数据。这有助于确保组件接收到的数据是预期的类型。

// 子组件
export default {props: {myMessage: String}
};
通过事件($emit)传递数据
  • 自定义事件的命名:子组件可以通过 $emit 方法发送自定义事件,并传递数据给父组件。事件名称通常使用小写字母,并用短横线分隔。
// 子组件
export default {methods: {sendMessage() {this.$emit('my-event', 'Hello from child');}}
};
使用 v-model 进行双向绑定
  • v-modelv-model 是 Vue 提供的一个语法糖,用于创建表单输入和应用状态之间的双向绑定。
<!-- 父组件 -->
<template><ChildComponent v-model="parentMessage" />
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {parentMessage: 'Hello from parent'};}
};
</script>

 小提示:当你在组件上使用 v-model 时,Vue 会自动使用 value 属性绑定到子组件,并在子组件上监听 input 事件,这一点十分抽象,作者初学时没人提醒,花了很大功夫才搞明白

进一步解释:

下面是一个简化的子组件示例,展示了如何实现

<template><input type="text" :value="value" @input="updateValue">
</template><script>
export default {props: ['value'], // 接收父组件传递的值methods: {updateValue(event) {this.$emit('update:value', event.target.value); // 触发 input 事件,更新父组件的值}}
};
</script>

在这个示例中,子组件有一个 input 元素,它使用 :value 绑定来接收父组件传递的值。当用户输入时,updateValue 方法会被调用,它使用 $emit 触发 input 事件,并传递新的输入值。这样,父组件的 parentMessage 就会被更新为新的输入值。

创建和实例化 Event Bus

  1. 创建 Event Bus:首先,你需要创建一个新的 Vue 实例作为 Event Bus。

    const EventBus = new Vue();
    
  2. 广播事件(𝑒𝑚𝑖𝑡):在需要发送数据的组件中,使用‘emit):在需要发送数据的组件中,使用‘emit` 方法来广播事件,并传递数据。

    EventBus.$emit('my-event', 'Hello from another component');
    
  3. 监听事件(𝑜𝑛):在需要接收数据的组件中,使用‘on):在需要接收数据的组件中,使用‘on` 方法来监听事件,并处理传递的数据。

    EventBus.$on('my-event', (data) => {console.log('Received message:', data);
    });
    
使用 Event Bus 进行事件传递和监听
  • 广播事件:当你想要从组件 A 向组件 B 传递数据时,组件 A 可以广播一个事件,并将数据作为参数传递。

  • 监听事件:组件 B 可以监听这个事件,并在事件触发时接收数据。

注意事项
  • 事件命名:为了防止命名冲突,通常建议使用有意义的名称来命名事件。
  • 事件解绑:如果你不再需要监听某个事件,应该使用 $off 方法来解绑事件监听器。
  • 组件销毁:当组件被销毁时,应该解绑所有的事件监听器,以避免内存泄漏。

Event Bus 是一种简单且有效的非父子组件通信方式,适用于组件之间没有直接关系的情况。通过这种方式,你可以在不同的组件之间传递数据,实现组件间的协作。

Vuex 状态管理

Vuex 的介绍和安装

Vuex 是一个第三方库,需要通过 npm 或 yarn 安装到你的项目中。

bash

复制

npm install vuex --save
# 或者
yarn add vuex
Vuex 的核心概念
  1. State:状态(State)是存储在仓库(Store)中的数据对象。Vuex 允许你直接访问仓库来读取状态。

  2. Getters:计算属性(Getters)允许你从状态中派生出新的数据。它们类似于 Vue 组件中的计算属性,但是它们在仓库级别定义,并且可以被所有组件访问。

  3. Mutations:突变(Mutations)是更改状态的唯一方法。每个突变都有一个字符串类型的名字和一个回调函数。

  4. Actions:动作(Actions)允许你执行异步操作,并且可以修改状态。它们类似于 mutations,但是可以处理异步逻辑。

  5. Modules:模块(Modules)是 Vuex 状态管理的高级特性,允许你将状态管理逻辑组织成模块,每个模块都有自己的状态、getters、mutations 和 actions。

使用 Vuex 进行组件通信的示例

以下是一个简单的 Vuex 示例,展示了如何使用 Vuex 进行组件通信:

  1. 创建 Store:首先,你需要创建一个 Vuex Store 实例。

    import Vue from 'vue';
    import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {increment({ commit }) {commit('increment');}}
    });
    
  2. 在组件中使用 Store:在组件中,你可以通过 this.$store 访问 Store。(这一块是命名空间的知识,我们需要在模块里加入这个语句:namespaced: true, // 启用命名空间)

    import { mapState, mapActions } from 'vuex';export default {computed: {...mapState(['count'])},methods: {...mapActions(['increment'])}
    };
    

在这个例子中,我们创建了一个简单的 Vuex Store,其中包含一个状态 count 和一个用于增加计数的 mutation。我们在组件中通过 mapState 和 mapActions 访问了 Store 的状态和 actions。这样,组件就可以通过 Vuex 进行通信,而不需要直接在组件之间传递数据。

总结

在本篇博客中,我们探讨了 Vue 组件通信的多种方法,包括:

  1. 父子组件通信

    • 通过 props 传递数据,实现单向数据流。
    • 使用 $emit 方法传递事件和数据。
    • 使用 v-model 实现双向绑定。
  2. 非父子组件通信

    • 使用 Event Bus 作为中央事件总线。
    • 创建和实例化 Event Bus。
    • 使用 𝑒𝑚𝑖𝑡和emit和on 进行事件传递和监听。
  3. Vuex 状态管理

    • 介绍 Vuex 及其核心概念。
    • 使用 Vuex 进行组件通信的示例。

希望这篇博客可以帮助到你,如果觉得有帮助麻烦给个点赞或则评论好吗

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

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

相关文章

从资金管理的角度 谈谈伦敦金投资技巧

刚进入伦敦金市场的时候&#xff0c;笔者认为技术分析是很重要的&#xff0c;所以将学习伦敦金投资技巧的精力全部投入到技术分析的学习中。经过一系列交易的亏损&#xff0c;笔者才发现&#xff0c;其实交易管理才是最重要的。如果管理得好&#xff0c;30%的胜率&#xff0c;投…

docker-compose部署node-exporter

一、安装 node_exporter:image: prom/node-exporter:v1.8.0container_name: node_exportervolumes:- /proc:/host/proc:ro- /sys:/host/sys:ro- /:/rootfs:ro# ports:# - 9100:9100environment:TZ: Asia/Shanghaicommand:- --path.procfs/host/proc- --path.rootfs/rootfs- -…

数据机构记录顺序表-笔记1

一、线性表的基本概念 数据元素&#xff1a;线性表中的基本单位&#xff0c;每个元素都是线性表的一部分。 数据项&#xff1a;数据元素的具体值。 存储位置&#xff1a;线性表中的元素在内存中的具体存储位置。 线性表按存储结构可以分为顺序表和链表两大类&#xff1a; 1.1…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招&#xff0c;怎么能只刷笔试题目呢&#xff0c;面试题目也得看&#xff0c;想当好厂的牛马其实…

快速上手指南:使用 Minikube 在本地运行 Kubernetes 集群

前言 Minikube 是一个开源工具&#xff0c;用于在本地运行 Kubernetes 集群。它提供了一种简单的方法来在本地开发和测试 Kubernetes 应用程序&#xff0c;而无需设置完整的 Kubernetes 集群。以下是 Minikube 的基本使用步骤&#xff1a; 安装 Minikube 安装依赖项 虚拟化…

java之静态方法

如果要在类中使用方法&#xff0c;就得需要将这个类实例化。有时候希望在不创建对象的情况下&#xff0c;通过类名直接调用某个方法&#xff0c;就得需要静态方法&#xff0c;要实现静态方法&#xff0c;只需要再成员方法前加上static关键字 静态方法也可以通过类名和对象访问…

Charles拦截发送数据包-cnblog

Charles拦截发送数据包 打开允许断点 右键要打断点的数据包&#xff0c;打断点 重新发请求进入断点模式 修改完毕后发送

拦截HTTP的多种方式

部分场景下需要修改请求报文信息&#xff0c;可以利用 AOP 思维&#xff08;切面编程&#xff09;&#xff0c;对请求进行拦截处理。Web 中有见的几种发送请求的方式&#xff1a; XMLHttpRequestfetchwindow.navigator.sendBeaconnew Imageservice worker 针对这几种不同的场…

C++实现简化版Qt的QObject(3):增加父子关系、属性系统

前几天写了文章&#xff1a; C实现一个简单的Qt信号槽机制 C实现简化版Qt信号槽机制&#xff08;2&#xff09;&#xff1a;增加内存安全保障 之后感觉还不够过瘾&#xff0c;Qt中的QObject体系里还有不少功能特性没有实现。为了提高QObject的还原度&#xff0c;今天我们将父子…

2024.06.29校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | 中国汽研2025届实习生招募 实习 | 中国汽研2025届实习生招募 2、开放周 | 航天513所暑期实践开放周邀请函 开放周 | 航天513所暑期实践开放周邀请函 3、开放日 | 中国电科第四…

vscode远程连接linux(配置免密)

远程连接 1.首先保证物理机和虚拟机网络可以ping通 2.查看ubuntu得ip地址 ifconfig IP为&#xff1a;192.168.52.133 3.连接远程主机 配置免密 1.打开cmd运行ssh-keygen -t rsa 一路回车就行 2.打开window文件夹C:\Users\xbj\.ssh 3.用记事本打开id_rsa.pub文件复制公…

LeetCode刷题之搜索二维矩阵

2024 7/5 一如既往的晴天&#xff0c;分享几张拍的照片嘿嘿&#xff0c;好几天没做题了&#xff0c;在徘徊、踌躇、踱步。蝉鸣的有些聒噪了&#xff0c;栀子花花苞也都掉落啦&#xff0c;今天给他剪了枝&#xff0c;接回一楼来了。ok&#xff0c;做题啦&#xff01; 图1、宿舍…

数据结构之“栈”(全方位认识)

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 栈是一种数据结构&#xff0c;具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲&#xff01;&#xff01; …

玩转springboot之springboot注册servlet

springboot注册servlet 有时候在springboot中依然需要注册servlet&#xff0c;filter&#xff0c;listener&#xff0c;就以servlet为例来进行说明&#xff0c;另外两个也都类似 使用WebServlet注解 在servlet3.0之后&#xff0c;servlet注册支持注解注册&#xff0c;而不需要在…

解决vscode配置C++编译带有中文名称报错问题

在新电脑上安装vscode运行带有中文路径和中文名称的C代码时遇到报错 根据别人的教程将laugh.json文件中"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",改成了"program": "${fileDirname}\\output\\test.exe",&#x…

文化财经macd顶底背离幅图指标公式源码

DIFF:EMA(CLOSE,12) - EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:2*(DIFF-DEA),COLORSTICK; JC:CROSS(DIFF,DEA); SC:CROSSDOWN(DIFF,DEA); N1:BARSLAST(JC)1; N2:BARSLAST(SC)1; HH:VALUEWHEN(CROSSDOWN(DIFF,DEA),HHV(H,N1));//上次MACD红柱期间合约最大值 HH2:VALUEWHE…

PyQT动态加载ui文件时,如何继承QMainWindow类

主要看mywindow类的写法 不继承时一般这样加载ui文件来创建一个界面&#xff1a; from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QWidget from PyQt5.uic import loadUiclass MyWindow():def __init__(self):self.ui loadUi("your_ui.ui"…

docker部署mycat,连接上面一篇的一主二从mysql

一、docker下载mycat镜像 查看安装结果 这个名称太长&#xff0c;在安装容器时不方便操作&#xff0c;设置标签为mycat docker tag longhronshens/mycat-docker mycat 二、安装容器 先安装一个&#xff0c;主要目的是获得配置文件 docker run -it -d --name mycat -p 8066:…

记一次使用“try-with-resources“的语法导致的BUG

背景描述 最近使用try-catch的时候遇到了一个问题&#xff0c;背景是这样的&#xff1a;当第一次与数据库建立连接以后执行查询完毕并没有手动关闭连接&#xff0c;但是当我第二次获取连接的时候报错了&#xff0c;显示数据库连接失败&#xff0c;连接已经关闭。 org.postgres…

nginx(三)—从Nginx配置熟悉Nginx功能

一、 Nginx配置文件结构 ... #全局块events { #events块... }http #http块 {... #http全局块server #server块{ ... #server全局块location [PATTERN] #location块{...}location [PATTERN] {...}}server{...}... #http全局块 …